@@ -1286,6 +1286,19 @@ 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+ }
12891302}
12901303
12911304impl < T : Pixel > fmt:: Display for FrameInvariants < T > {
@@ -3681,11 +3694,14 @@ pub fn encode_show_existing_frame<T: Pixel>(
36813694 }
36823695
36833696 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 ( ) ;
3697+ write_t35_metadata_packet ( & mut packet, t35) ;
3698+ }
3699+
3700+ // HDR10+ Metadata OBU from config
3701+ if let Some ( t35) = fi. hdr10plus_metadata ( ) {
3702+ if !fi. t35_metadata . iter ( ) . any ( |t35| t35. is_hdr10plus_metadata ( ) ) {
3703+ write_t35_metadata_packet ( & mut packet, t35) ;
3704+ }
36893705 }
36903706
36913707 let mut buf1 = Vec :: new ( ) ;
@@ -3761,11 +3777,14 @@ pub fn encode_frame<T: Pixel>(
37613777 }
37623778
37633779 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 ( ) ;
3780+ write_t35_metadata_packet ( & mut packet, t35) ;
3781+ }
3782+
3783+ // HDR10+ Metadata OBU from config
3784+ if let Some ( t35) = fi. hdr10plus_metadata ( ) {
3785+ if !fi. t35_metadata . iter ( ) . any ( |t35| t35. is_hdr10plus_metadata ( ) ) {
3786+ write_t35_metadata_packet ( & mut packet, t35) ;
3787+ }
37693788 }
37703789
37713790 let mut buf1 = Vec :: new ( ) ;
@@ -3821,6 +3840,14 @@ pub fn update_rec_buffer<T: Pixel>(
38213840 }
38223841}
38233842
3843+ fn write_t35_metadata_packet ( packet : & mut Vec < u8 > , t35 : & T35 ) {
3844+ let mut t35_buf = Vec :: new ( ) ;
3845+ let mut t35_bw = BitWriter :: endian ( & mut t35_buf, BigEndian ) ;
3846+ t35_bw. write_t35_metadata_obu ( t35) . unwrap ( ) ;
3847+ packet. write_all ( & t35_buf) . unwrap ( ) ;
3848+ t35_buf. clear ( ) ;
3849+ }
3850+
38243851#[ cfg( test) ]
38253852mod test {
38263853 use super :: * ;
0 commit comments