|
11 | 11 | use crate::activity::ActivityMask;
|
12 | 12 | use crate::api::lookahead::*;
|
13 | 13 | use crate::api::{
|
14 |
| - EncoderConfig, EncoderStatus, FrameType, Opaque, Packet, T35, |
| 14 | + EncoderConfig, EncoderStatus, FrameType, Opaque, Packet, ST2094_40_PREFIX, |
| 15 | + T35, |
15 | 16 | };
|
16 | 17 | use crate::color::ChromaSampling::Cs400;
|
17 | 18 | use crate::cpu_features::CpuFeatureLevel;
|
@@ -349,14 +350,27 @@ impl<T: Pixel> ContextInner<T> {
|
349 | 350 | }
|
350 | 351 | self.frame_q.insert(input_frameno, frame);
|
351 | 352 |
|
| 353 | + // Update T.35 metadata from encoder config |
| 354 | + let maybe_updated_t35_metadata = self.get_maybe_updated_t35_metadata( |
| 355 | + input_frameno, |
| 356 | + params.as_ref().map(|params| params.t35_metadata.as_ref()), |
| 357 | + ); |
| 358 | + |
352 | 359 | if let Some(params) = params {
|
353 | 360 | if params.frame_type_override == FrameTypeOverride::Key {
|
354 | 361 | self.keyframes_forced.insert(input_frameno);
|
355 | 362 | }
|
356 | 363 | if let Some(op) = params.opaque {
|
357 | 364 | self.opaque_q.insert(input_frameno, op);
|
358 | 365 | }
|
359 |
| - self.t35_q.insert(input_frameno, params.t35_metadata); |
| 366 | + |
| 367 | + if let Some(new_t35_metadata) = maybe_updated_t35_metadata { |
| 368 | + self.t35_q.insert(input_frameno, new_t35_metadata.into_boxed_slice()); |
| 369 | + } else { |
| 370 | + self.t35_q.insert(input_frameno, params.t35_metadata); |
| 371 | + } |
| 372 | + } else if let Some(new_t35_metadata) = maybe_updated_t35_metadata { |
| 373 | + self.t35_q.insert(input_frameno, new_t35_metadata.into_boxed_slice()); |
360 | 374 | }
|
361 | 375 |
|
362 | 376 | if !self.needs_more_frame_q_lookahead(self.next_lookahead_frame) {
|
@@ -1719,4 +1733,51 @@ impl<T: Pixel> ContextInner<T> {
|
1719 | 1733 | (prev_keyframe_nframes, prev_keyframe_ntus)
|
1720 | 1734 | }
|
1721 | 1735 | }
|
| 1736 | + |
| 1737 | + /// Updates the T.35 metadata to be added to the frame. |
| 1738 | + /// The existing T.35 array may come from `FrameParameters`. |
| 1739 | + /// |
| 1740 | + /// Added from [`EncoderConfig`]: |
| 1741 | + /// - HDR10+, ST2094-40 in `hdr10plus_payloads`. |
| 1742 | + /// |
| 1743 | + /// Returns an `Option`, where `None` means the T.35 metadata is unchanged. |
| 1744 | + /// Otherwise, the updated T.35 metadata is returned. |
| 1745 | + fn get_maybe_updated_t35_metadata( |
| 1746 | + &self, input_frameno: u64, maybe_existing_t35_metadata: Option<&[T35]>, |
| 1747 | + ) -> Option<Vec<T35>> { |
| 1748 | + let hdr10plus_payload = self |
| 1749 | + .config |
| 1750 | + .hdr10plus_payloads |
| 1751 | + .as_ref() |
| 1752 | + .and_then(|list| list.get(&input_frameno)); |
| 1753 | + |
| 1754 | + let update_t35_metadata = hdr10plus_payload.is_some(); |
| 1755 | + |
| 1756 | + let mut new_t35_metadata = if update_t35_metadata { |
| 1757 | + Some( |
| 1758 | + maybe_existing_t35_metadata.map_or_else(Vec::new, |t35| t35.to_vec()), |
| 1759 | + ) |
| 1760 | + } else { |
| 1761 | + None |
| 1762 | + }; |
| 1763 | + |
| 1764 | + if let Some(list) = new_t35_metadata.as_mut() { |
| 1765 | + // HDR10+, ST2094-40 |
| 1766 | + if let Some(payload) = hdr10plus_payload { |
| 1767 | + let has_existing_hdr10plus_meta = list.iter().any(|t35| { |
| 1768 | + t35.country_code == 0xB5 && t35.data.starts_with(ST2094_40_PREFIX) |
| 1769 | + }); |
| 1770 | + |
| 1771 | + if !has_existing_hdr10plus_meta { |
| 1772 | + list.push(T35 { |
| 1773 | + country_code: 0xB5, |
| 1774 | + country_code_extension_byte: 0x00, |
| 1775 | + data: payload.clone().into_boxed_slice(), |
| 1776 | + }); |
| 1777 | + } |
| 1778 | + } |
| 1779 | + } |
| 1780 | + |
| 1781 | + new_t35_metadata |
| 1782 | + } |
1722 | 1783 | }
|
0 commit comments