@@ -1284,6 +1284,19 @@ impl<T: Pixel> FrameInvariants<T> {
1284
1284
self . input_frameno * TIMESTAMP_BASE_UNIT * self . sequence . time_base . num
1285
1285
/ self . sequence . time_base . den
1286
1286
}
1287
+
1288
+ /// HDR10+ Metadata as T.35 metadata from [`EncoderConfig`]
1289
+ pub fn hdr10plus_metadata ( & self ) -> Option < & T35 > {
1290
+ if !( self . show_frame || self . is_show_existing_frame ( ) ) {
1291
+ return None ;
1292
+ }
1293
+
1294
+ self
1295
+ . config
1296
+ . hdr10plus_payloads
1297
+ . as_ref ( )
1298
+ . and_then ( |payloads| payloads. get ( & self . input_frameno ) )
1299
+ }
1287
1300
}
1288
1301
1289
1302
impl < T : Pixel > fmt:: Display for FrameInvariants < T > {
@@ -3686,11 +3699,14 @@ pub fn encode_show_existing_frame<T: Pixel>(
3686
3699
}
3687
3700
3688
3701
for t35 in fi. t35_metadata . iter ( ) {
3689
- let mut t35_buf = Vec :: new ( ) ;
3690
- let mut t35_bw = BitWriter :: endian ( & mut t35_buf, BigEndian ) ;
3691
- t35_bw. write_t35_metadata_obu ( t35) . unwrap ( ) ;
3692
- packet. write_all ( & t35_buf) . unwrap ( ) ;
3693
- t35_buf. clear ( ) ;
3702
+ write_t35_metadata_packet ( & mut packet, t35) ;
3703
+ }
3704
+
3705
+ // HDR10+ Metadata OBU from config
3706
+ if let Some ( t35) = fi. hdr10plus_metadata ( ) {
3707
+ if !fi. t35_metadata . iter ( ) . any ( |t35| t35. is_hdr10plus_metadata ( ) ) {
3708
+ write_t35_metadata_packet ( & mut packet, t35) ;
3709
+ }
3694
3710
}
3695
3711
3696
3712
let mut buf1 = Vec :: new ( ) ;
@@ -3767,11 +3783,14 @@ pub fn encode_frame<T: Pixel>(
3767
3783
}
3768
3784
3769
3785
for t35 in fi. t35_metadata . iter ( ) {
3770
- let mut t35_buf = Vec :: new ( ) ;
3771
- let mut t35_bw = BitWriter :: endian ( & mut t35_buf, BigEndian ) ;
3772
- t35_bw. write_t35_metadata_obu ( t35) . unwrap ( ) ;
3773
- packet. write_all ( & t35_buf) . unwrap ( ) ;
3774
- t35_buf. clear ( ) ;
3786
+ write_t35_metadata_packet ( & mut packet, t35) ;
3787
+ }
3788
+
3789
+ // HDR10+ Metadata OBU from config
3790
+ if let Some ( t35) = fi. hdr10plus_metadata ( ) {
3791
+ if !fi. t35_metadata . iter ( ) . any ( |t35| t35. is_hdr10plus_metadata ( ) ) {
3792
+ write_t35_metadata_packet ( & mut packet, t35) ;
3793
+ }
3775
3794
}
3776
3795
3777
3796
let mut buf1 = Vec :: new ( ) ;
@@ -3827,6 +3846,14 @@ pub fn update_rec_buffer<T: Pixel>(
3827
3846
}
3828
3847
}
3829
3848
3849
+ fn write_t35_metadata_packet ( packet : & mut Vec < u8 > , t35 : & T35 ) {
3850
+ let mut t35_buf = Vec :: new ( ) ;
3851
+ let mut t35_bw = BitWriter :: endian ( & mut t35_buf, BigEndian ) ;
3852
+ t35_bw. write_t35_metadata_obu ( t35) . unwrap ( ) ;
3853
+ packet. write_all ( & t35_buf) . unwrap ( ) ;
3854
+ t35_buf. clear ( ) ;
3855
+ }
3856
+
3830
3857
#[ cfg( test) ]
3831
3858
mod test {
3832
3859
use super :: * ;
0 commit comments