Skip to content

Commit b641b8c

Browse files
committed
fix: update transmuxer
1 parent e7c7027 commit b641b8c

File tree

24 files changed

+953
-320
lines changed

24 files changed

+953
-320
lines changed

Cargo.lock

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/bytes-util/src/zero_copy/serde.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ impl Serialize for StringCow<'_> {
238238
}
239239

240240
/// A 24-bit signed integer in big-endian byte order.
241-
#[derive(Debug, Clone, Copy)]
241+
#[derive(Debug, Clone, Copy, Default)]
242242
pub struct I24Be(pub i32);
243243

244244
impl<'a> Deserialize<'a> for I24Be {
@@ -271,7 +271,7 @@ impl Deref for I24Be {
271271
}
272272

273273
/// A 48-bit signed integer in big-endian byte order.
274-
#[derive(Debug, Clone, Copy)]
274+
#[derive(Debug, Clone, Copy, Default)]
275275
pub struct I48Be(pub i64);
276276

277277
impl<'a> Deserialize<'a> for I48Be {
@@ -304,7 +304,7 @@ impl Deref for I48Be {
304304
}
305305

306306
/// A 24-bit unsigned integer in big-endian byte order.
307-
#[derive(Debug, Clone, Copy)]
307+
#[derive(Debug, Clone, Copy, Default)]
308308
pub struct U24Be(pub u32);
309309

310310
impl<'a> Deserialize<'a> for U24Be {
@@ -337,7 +337,7 @@ impl Deref for U24Be {
337337
}
338338

339339
/// A 48-bit unsigned integer in big-endian byte order.
340-
#[derive(Debug, Clone, Copy)]
340+
#[derive(Debug, Clone, Copy, Default)]
341341
pub struct U48Be(pub u64);
342342

343343
impl<'a> Deserialize<'a> for U48Be {

crates/isobmff/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ byteorder = "1.5.0"
1919
bytes = "1.10.1"
2020
bitflags = "2.9.0"
2121
base64 = "0.22.1"
22+
fixed = "1.29.0"
2223
isobmff-derive = { path = "./derive", version = "0.1.0" }
2324
nutype-enum = { path = "../nutype_enum", version = "0.1.4" }
2425
scuffle-bytes-util = { path = "../bytes-util", version = "0.2.0" }

crates/isobmff/src/boxes/audio_media.rs

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::io;
22

3+
use fixed::types::extra::{U8, U16};
4+
use fixed::{FixedI16, FixedU32};
35
use scuffle_bytes_util::zero_copy::{Deserialize, DeserializeSeed, Serialize, SerializeSeed};
46
use scuffle_bytes_util::{BitWriter, BytesCow};
57

@@ -10,14 +12,50 @@ use crate::{BoxHeader, FullBoxHeader, IsoBox, IsoSized};
1012
/// Sound media header
1113
///
1214
/// ISO/IEC 14496-12 - 12.2.2
13-
#[derive(IsoBox, Debug)]
14-
#[iso_box(box_type = b"smhd", crate_path = crate)]
15+
#[derive(IsoBox, Debug, Default)]
16+
#[iso_box(box_type = b"smhd", skip_impl(deserialize_seed, serialize, sized), crate_path = crate)]
1517
pub struct SoundMediaHeaderBox {
1618
pub full_header: FullBoxHeader,
17-
pub balance: i16,
19+
pub balance: FixedI16<U8>,
1820
pub reserved: u16,
1921
}
2022

23+
impl<'a> DeserializeSeed<'a, BoxHeader> for SoundMediaHeaderBox {
24+
fn deserialize_seed<R>(mut reader: R, _seed: BoxHeader) -> io::Result<Self>
25+
where
26+
R: scuffle_bytes_util::zero_copy::ZeroCopyReader<'a>,
27+
{
28+
let full_header = FullBoxHeader::deserialize(&mut reader)?;
29+
let balance = FixedI16::from_bits(i16::deserialize(&mut reader)?);
30+
let reserved = u16::deserialize(&mut reader)?;
31+
32+
Ok(Self {
33+
full_header,
34+
balance,
35+
reserved,
36+
})
37+
}
38+
}
39+
40+
impl Serialize for SoundMediaHeaderBox {
41+
fn serialize<W>(&self, mut writer: W) -> io::Result<()>
42+
where
43+
W: std::io::Write,
44+
{
45+
self.serialize_box_header(&mut writer)?;
46+
self.full_header.serialize(&mut writer)?;
47+
self.balance.to_bits().serialize(&mut writer)?;
48+
self.reserved.serialize(&mut writer)?;
49+
Ok(())
50+
}
51+
}
52+
53+
impl IsoSized for SoundMediaHeaderBox {
54+
fn size(&self) -> usize {
55+
Self::add_header_size(self.full_header.size() + 2 + 2)
56+
}
57+
}
58+
2159
/// Audio sample entry
2260
///
2361
/// ISO/IEC 14496-12 - 12.2.3
@@ -41,11 +79,11 @@ pub struct AudioSampleEntry {
4179
pub samplesize: u16,
4280
pub pre_defined: u16,
4381
pub reserved2: u16,
44-
pub samplerate: u32,
82+
pub samplerate: FixedU32<U16>,
4583
}
4684

4785
impl AudioSampleEntry {
48-
pub fn new(sample_entry: SampleEntry, channelcount: u16, samplesize: u16, samplerate: u32) -> Self {
86+
pub fn new(sample_entry: SampleEntry, channelcount: u16, samplesize: u16, samplerate: FixedU32<U16>) -> Self {
4987
Self {
5088
sample_entry,
5189
reserved1: 0,
@@ -69,7 +107,7 @@ impl<'a> Deserialize<'a> for AudioSampleEntry {
69107
let samplesize = u16::deserialize(&mut reader)?;
70108
let pre_defined = u16::deserialize(&mut reader)?;
71109
let reserved2 = u16::deserialize(&mut reader)?;
72-
let samplerate = u32::deserialize(&mut reader)?;
110+
let samplerate = FixedU32::from_bits(u32::deserialize(&mut reader)?);
73111

74112
Ok(Self {
75113
sample_entry,
@@ -94,7 +132,7 @@ impl Serialize for AudioSampleEntry {
94132
self.samplesize.serialize(&mut writer)?;
95133
self.pre_defined.serialize(&mut writer)?;
96134
self.reserved2.serialize(&mut writer)?;
97-
self.samplerate.serialize(&mut writer)?;
135+
self.samplerate.to_bits().serialize(&mut writer)?;
98136
Ok(())
99137
}
100138
}
@@ -142,7 +180,7 @@ pub struct AudioSampleEntryV1 {
142180
pub samplesize: u16,
143181
pub pre_defined: u16,
144182
pub reserved2: u16,
145-
pub samplerate: u32,
183+
pub samplerate: FixedU32<U16>,
146184
}
147185

148186
impl<'a> Deserialize<'a> for AudioSampleEntryV1 {
@@ -157,7 +195,7 @@ impl<'a> Deserialize<'a> for AudioSampleEntryV1 {
157195
let samplesize = u16::deserialize(&mut reader)?;
158196
let pre_defined = u16::deserialize(&mut reader)?;
159197
let reserved2 = u16::deserialize(&mut reader)?;
160-
let samplerate = u32::deserialize(&mut reader)?;
198+
let samplerate = FixedU32::from_bits(u32::deserialize(&mut reader)?);
161199

162200
Ok(Self {
163201
sample_entry,
@@ -184,7 +222,7 @@ impl Serialize for AudioSampleEntryV1 {
184222
self.samplesize.serialize(&mut writer)?;
185223
self.pre_defined.serialize(&mut writer)?;
186224
self.reserved2.serialize(&mut writer)?;
187-
self.samplerate.serialize(&mut writer)?;
225+
self.samplerate.to_bits().serialize(&mut writer)?;
188226
Ok(())
189227
}
190228
}

crates/isobmff/src/boxes/general.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ pub struct MediaDataBox<'a> {
1616
pub data: BytesCow<'a>,
1717
}
1818

19+
impl<'a> MediaDataBox<'a> {
20+
pub fn new(data: BytesCow<'a>) -> Self {
21+
Self { data }
22+
}
23+
}
24+
1925
impl Debug for MediaDataBox<'_> {
2026
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2127
f.debug_struct("MediaDataBox").field("data.len", &self.data.len()).finish()

crates/isobmff/src/boxes/movie.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
//! Movie structure boxes defined in ISO/IEC 14496-12 - 8.2
22
3+
use fixed::traits::ToFixed;
4+
use fixed::types::extra::{U8, U16};
5+
use fixed::{FixedI16, FixedI32};
36
use scuffle_bytes_util::zero_copy::{Deserialize, DeserializeSeed, Serialize};
47

58
use super::{MetaBox, MovieExtendsBox, TrackBox, UserDataBox};
@@ -36,15 +39,34 @@ pub struct MovieHeaderBox {
3639
pub modification_time: u64,
3740
pub timescale: u32,
3841
pub duration: u64,
39-
pub rate: i32,
40-
pub volume: i16,
42+
pub rate: FixedI32<U16>,
43+
pub volume: FixedI16<U8>,
4144
pub reserved1: u16,
4245
pub reserved2: u64,
4346
pub matrix: [i32; 9],
4447
pub pre_defined: [u32; 6],
4548
pub next_track_id: u32,
4649
}
4750

51+
impl MovieHeaderBox {
52+
pub fn new(creation_time: u64, modification_time: u64, timescale: u32, duration: u64, next_track_id: u32) -> Self {
53+
Self {
54+
full_header: FullBoxHeader::default(),
55+
creation_time,
56+
modification_time,
57+
timescale,
58+
duration,
59+
rate: 1.to_fixed(),
60+
volume: 1.to_fixed(),
61+
reserved1: 0,
62+
reserved2: 0,
63+
matrix: [0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000],
64+
pre_defined: [0; 6],
65+
next_track_id,
66+
}
67+
}
68+
}
69+
4870
impl<'a> DeserializeSeed<'a, BoxHeader> for MovieHeaderBox {
4971
fn deserialize_seed<R>(mut reader: R, _seed: BoxHeader) -> std::io::Result<Self>
5072
where
@@ -69,8 +91,8 @@ impl<'a> DeserializeSeed<'a, BoxHeader> for MovieHeaderBox {
6991
u32::deserialize(&mut reader)? as u64
7092
};
7193

72-
let rate = i32::deserialize(&mut reader)?;
73-
let volume = i16::deserialize(&mut reader)?;
94+
let rate = FixedI32::from_bits(i32::deserialize(&mut reader)?);
95+
let volume = FixedI16::from_bits(i16::deserialize(&mut reader)?);
7496

7597
let reserved1 = u16::deserialize(&mut reader)?;
7698
let reserved2 = u64::deserialize(&mut reader)?;
@@ -124,8 +146,8 @@ impl Serialize for MovieHeaderBox {
124146
(self.duration as u32).serialize(&mut writer)?;
125147
}
126148

127-
self.rate.serialize(&mut writer)?;
128-
self.volume.serialize(&mut writer)?;
149+
self.rate.to_bits().serialize(&mut writer)?;
150+
self.volume.to_bits().serialize(&mut writer)?;
129151
self.reserved1.serialize(&mut writer)?;
130152
self.reserved2.serialize(&mut writer)?;
131153
self.matrix.serialize(&mut writer)?;

0 commit comments

Comments
 (0)