its joever
This commit is contained in:
parent
691d5dd67e
commit
f21850d181
3 changed files with 44 additions and 3 deletions
|
@ -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()
|
||||||
|
},
|
||||||
} ],
|
} ],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue