its joever

This commit is contained in:
Muaz Ahmad 2023-10-26 00:13:53 +05:00
parent 691d5dd67e
commit f21850d181
3 changed files with 44 additions and 3 deletions

View file

@ -1057,12 +1057,14 @@ impl MP4Atom for MFHD {
struct TRAF { struct TRAF {
tfhd: TFHD, tfhd: TFHD,
tfdt: TFDT,
trun: TRUN, trun: TRUN,
} }
impl MP4Atom for TRAF { impl MP4Atom for TRAF {
fn marshall(&self) -> Vec<u8> { fn marshall(&self) -> Vec<u8> {
let mut content = self.tfhd.marshall(); let mut content = self.tfhd.marshall();
content.append(&mut self.tfdt.marshall());
content.append(&mut self.trun.marshall()); content.append(&mut self.trun.marshall());
make_box(content, *b"traf") make_box(content, *b"traf")
} }
@ -1097,6 +1099,36 @@ impl Default for TFHD {
} }
} }
struct TFDT {
version: u8,
flags: u32,
start_time: u64,
}
impl MP4Atom for TFDT {
fn marshall(&self) -> Vec<u8> {
let mut content = Vec::new();
content.push(self.version);
content.extend_from_slice(&self.flags.to_be_bytes()[1..]);
if self.version == 1 {
content.extend_from_slice(&self.start_time.to_be_bytes());
} else {
content.extend_from_slice(&(self.start_time as u32).to_be_bytes());
}
make_box(content, *b"tfdt")
}
}
impl Default for TFDT {
fn default() -> Self {
TFDT {
version: 0,
flags: 0,
start_time: 0,
}
}
}
struct TRUN { struct TRUN {
version: u8, version: u8,
flags: u32, flags: u32,
@ -1160,7 +1192,7 @@ impl MP4Atom for MDAT {
} }
pub fn new_moof(v_samples: &Vec<samples::Sample>, default_dur_v: u32, a_samples: &Vec<samples::Sample>, default_dur_a: u32, mdat_v_offset: usize, mdat_a_offset: usize, moof_idx: usize) -> MOOF { pub fn new_moof(v_samples: &Vec<samples::Sample>, default_dur_v: u32, a_samples: &Vec<samples::Sample>, default_dur_a: u32, mdat_v_offset: usize, mdat_a_offset: usize, moof_idx: usize) -> MOOF {
let mdat_data_start = 120 + v_samples.len() * 8 + a_samples.len() * 8 + 8; let mdat_data_start = 152 + v_samples.len() * 8 + a_samples.len() * 8 + 8;
MOOF { MOOF {
mfhd: MFHD { seq_num: moof_idx as u32, ..Default::default() }, mfhd: MFHD { seq_num: moof_idx as u32, ..Default::default() },
trafs: [ TRAF { trafs: [ TRAF {
@ -1170,6 +1202,10 @@ pub fn new_moof(v_samples: &Vec<samples::Sample>, default_dur_v: u32, a_samples:
..Default::default() ..Default::default()
}, },
trun: new_trun(v_samples, mdat_v_offset + mdat_data_start), trun: new_trun(v_samples, mdat_v_offset + mdat_data_start),
tfdt: TFDT {
start_time: default_dur_v as u64 * (v_samples.len() * (moof_idx - 1)) as u64,
..Default::default()
},
}, TRAF{ }, TRAF{
tfhd: TFHD { tfhd: TFHD {
track_id: 2, track_id: 2,
@ -1177,6 +1213,10 @@ pub fn new_moof(v_samples: &Vec<samples::Sample>, default_dur_v: u32, a_samples:
..Default::default() ..Default::default()
}, },
trun: new_trun(a_samples, mdat_a_offset + mdat_data_start), trun: new_trun(a_samples, mdat_a_offset + mdat_data_start),
tfdt: TFDT {
start_time: default_dur_a as u64 * (a_samples.len() * (moof_idx - 1)) as u64,
..Default::default()
},
} ], } ],
} }
} }

View file

@ -54,13 +54,14 @@ impl mp4::MP4Muxer {
return return
} }
} }
i += 1;
} }
}); });
thread::spawn(move || { thread::spawn(move || {
loop { loop {
match a.recv() { match a.recv() {
Ok(x) => {a_queue.push(x.packet_data, 0x01010000);}, Ok(x) => {a_queue.push(x.packet_data, 0x02000000);},
Err(_) => { Err(_) => {
util::thread_freeze(err_in2, Box::new(util::MuxerError::AudioEOF)); util::thread_freeze(err_in2, Box::new(util::MuxerError::AudioEOF));
return return

View file

@ -18,7 +18,7 @@ pub struct Segment {
impl Segment { impl Segment {
pub fn dump(&self) { pub fn dump(&self) {
let mdat = self.new_mdat(); let mdat = self.new_mdat();
let moof = atoms::new_moof(&self.segment_video, self.sample_duration_v, &self.segment_audio, self.sample_duration_a, 0, mdat.v_samples.len(), self.idx); let moof = atoms::new_moof(&self.segment_video, self.sample_duration_v, &self.segment_audio, self.sample_duration_a, 0, mdat.v_samples.len(), self.idx + 1);
let mut segment_bytes = moof.marshall(); let mut segment_bytes = moof.marshall();
segment_bytes.append(&mut mdat.marshall()); segment_bytes.append(&mut mdat.marshall());