aboutsummaryrefslogtreecommitdiff
path: root/remuxer/mp4/src
diff options
context:
space:
mode:
Diffstat (limited to 'remuxer/mp4/src')
-rw-r--r--remuxer/mp4/src/boxes.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/remuxer/mp4/src/boxes.rs b/remuxer/mp4/src/boxes.rs
index f695d98..5a4e108 100644
--- a/remuxer/mp4/src/boxes.rs
+++ b/remuxer/mp4/src/boxes.rs
@@ -414,6 +414,12 @@ impl WriteBox for AVCSampleEntry<'_> {
fn write(&self, buf: &mut Vec<u8>) {
self.visual.write(buf);
BoxW(buf).write(&self.config);
+ if let Some(colr) = &self.visual.colr {
+ BoxW(buf).write(colr);
+ }
+ if let Some(pasp) = &self.visual.pasp {
+ BoxW(buf).write(pasp);
+ }
}
}
@@ -446,6 +452,8 @@ pub struct VisualSampleEntry {
pub frame_count: u16,
pub compressorname: [u8; 32],
pub depth: u16,
+ pub pasp: Option<PixelAspectRatio>,
+ pub colr: Option<ColourInformation>,
}
impl WriteBox for VisualSampleEntry {
const BOXTYPE: [u8; 4] = [0; 4];
@@ -476,6 +484,58 @@ impl Default for VisualSampleEntry {
frame_count: 1,
compressorname: [0; 32],
depth: 0x0018,
+ pasp: None,
+ colr: None,
+ }
+ }
+}
+
+pub struct PixelAspectRatio {
+ pub h_spacing: u32,
+ pub v_spacing: u32,
+}
+impl WriteBox for PixelAspectRatio {
+ const BOXTYPE: [u8; 4] = *b"pasp";
+ fn write(&self, buf: &mut Vec<u8>) {
+ buf.extend(self.h_spacing.to_be_bytes());
+ buf.extend(self.v_spacing.to_be_bytes());
+ }
+}
+
+pub enum ColourInformation {
+ OnScreenColours {
+ colour_primaries: u16,
+ transfer_charateristics: u16,
+ matrix_coefficients: u16,
+ full_range: bool,
+ },
+ RestrictedICC,
+ UnrestrictedICC,
+}
+impl WriteBox for ColourInformation {
+ const BOXTYPE: [u8; 4] = *b"colr";
+ fn write(&self, buf: &mut Vec<u8>) {
+ match self {
+ ColourInformation::OnScreenColours {
+ colour_primaries,
+ transfer_charateristics,
+ matrix_coefficients,
+ full_range,
+ } => {
+ buf.extend(b"nclx");
+ buf.extend(colour_primaries.to_be_bytes());
+ buf.extend(transfer_charateristics.to_be_bytes());
+ buf.extend(matrix_coefficients.to_be_bytes());
+ buf.push((*full_range as u8) << 7);
+ }
+ ColourInformation::RestrictedICC => {
+ buf.extend(b"rICC");
+ todo!()
+ }
+ ColourInformation::UnrestrictedICC => {
+ buf.extend(b"prof");
+ todo!()
+ }
}
}
}