@@ -1286,6 +1286,26 @@ impl<T: Pixel> FrameInvariants<T> {
12861286 self . input_frameno * TIMESTAMP_BASE_UNIT * self . sequence . time_base . num
12871287 / self . sequence . time_base . den
12881288 }
1289+
1290+ /// HDR10+ Metadata as T.35 metadata from [`EncoderConfig`]
1291+ pub fn hdr10plus_metadata ( & self ) -> Option < T35 > {
1292+ if !( self . show_frame || self . is_show_existing_frame ( ) ) {
1293+ return None ;
1294+ }
1295+
1296+ self
1297+ . config
1298+ . hdr10plus_payloads
1299+ . as_ref ( )
1300+ . and_then ( |payloads| payloads. get ( & self . input_frameno ) )
1301+ . and_then ( |payload| {
1302+ Some ( T35 {
1303+ country_code : 0xB5 ,
1304+ country_code_extension_byte : 0x00 ,
1305+ data : payload. clone ( ) . into_boxed_slice ( ) ,
1306+ } )
1307+ } )
1308+ }
12891309}
12901310
12911311impl < T : Pixel > fmt:: Display for FrameInvariants < T > {
@@ -3681,11 +3701,14 @@ pub fn encode_show_existing_frame<T: Pixel>(
36813701 }
36823702
36833703 for t35 in fi. t35_metadata . iter ( ) {
3684- let mut t35_buf = Vec :: new ( ) ;
3685- let mut t35_bw = BitWriter :: endian ( & mut t35_buf, BigEndian ) ;
3686- t35_bw. write_t35_metadata_obu ( t35) . unwrap ( ) ;
3687- packet. write_all ( & t35_buf) . unwrap ( ) ;
3688- t35_buf. clear ( ) ;
3704+ write_t35_metadata_packet ( & mut packet, t35) ;
3705+ }
3706+
3707+ // HDR10+ Metadata OBU from config
3708+ if let Some ( t35) = fi. hdr10plus_metadata ( ) {
3709+ if !fi. t35_metadata . iter ( ) . any ( |t35| t35. is_hdr10plus_metadata ( ) ) {
3710+ write_t35_metadata_packet ( & mut packet, & t35) ;
3711+ }
36893712 }
36903713
36913714 let mut buf1 = Vec :: new ( ) ;
@@ -3761,11 +3784,14 @@ pub fn encode_frame<T: Pixel>(
37613784 }
37623785
37633786 for t35 in fi. t35_metadata . iter ( ) {
3764- let mut t35_buf = Vec :: new ( ) ;
3765- let mut t35_bw = BitWriter :: endian ( & mut t35_buf, BigEndian ) ;
3766- t35_bw. write_t35_metadata_obu ( t35) . unwrap ( ) ;
3767- packet. write_all ( & t35_buf) . unwrap ( ) ;
3768- t35_buf. clear ( ) ;
3787+ write_t35_metadata_packet ( & mut packet, t35) ;
3788+ }
3789+
3790+ // HDR10+ Metadata OBU from config
3791+ if let Some ( t35) = fi. hdr10plus_metadata ( ) {
3792+ if !fi. t35_metadata . iter ( ) . any ( |t35| t35. is_hdr10plus_metadata ( ) ) {
3793+ write_t35_metadata_packet ( & mut packet, & t35) ;
3794+ }
37693795 }
37703796
37713797 let mut buf1 = Vec :: new ( ) ;
@@ -3821,6 +3847,14 @@ pub fn update_rec_buffer<T: Pixel>(
38213847 }
38223848}
38233849
3850+ fn write_t35_metadata_packet ( packet : & mut Vec < u8 > , t35 : & T35 ) {
3851+ let mut t35_buf = Vec :: new ( ) ;
3852+ let mut t35_bw = BitWriter :: endian ( & mut t35_buf, BigEndian ) ;
3853+ t35_bw. write_t35_metadata_obu ( t35) . unwrap ( ) ;
3854+ packet. write_all ( & t35_buf) . unwrap ( ) ;
3855+ t35_buf. clear ( ) ;
3856+ }
3857+
38243858#[ cfg( test) ]
38253859mod test {
38263860 use super :: * ;
0 commit comments