@@ -1286,6 +1286,26 @@ impl<T: Pixel> FrameInvariants<T> {
1286
1286
self . input_frameno * TIMESTAMP_BASE_UNIT * self . sequence . time_base . num
1287
1287
/ self . sequence . time_base . den
1288
1288
}
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
+ }
1289
1309
}
1290
1310
1291
1311
impl < T : Pixel > fmt:: Display for FrameInvariants < T > {
@@ -3681,11 +3701,14 @@ pub fn encode_show_existing_frame<T: Pixel>(
3681
3701
}
3682
3702
3683
3703
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
+ }
3689
3712
}
3690
3713
3691
3714
let mut buf1 = Vec :: new ( ) ;
@@ -3761,11 +3784,14 @@ pub fn encode_frame<T: Pixel>(
3761
3784
}
3762
3785
3763
3786
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
+ }
3769
3795
}
3770
3796
3771
3797
let mut buf1 = Vec :: new ( ) ;
@@ -3821,6 +3847,14 @@ pub fn update_rec_buffer<T: Pixel>(
3821
3847
}
3822
3848
}
3823
3849
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
+
3824
3858
#[ cfg( test) ]
3825
3859
mod test {
3826
3860
use super :: * ;
0 commit comments