mirror of
https://github.com/alfg/mp4-rust.git
synced 2024-06-11 09:29:21 +00:00
Merge 4c9a6aa350
into 35560e94f5
This commit is contained in:
commit
15a42f0467
|
@ -98,9 +98,11 @@ impl<R: Read + Seek> Mp4Reader<R> {
|
||||||
// Update tracks if any fragmented (moof) boxes are found.
|
// Update tracks if any fragmented (moof) boxes are found.
|
||||||
if !moofs.is_empty() {
|
if !moofs.is_empty() {
|
||||||
let mut default_sample_duration = 0;
|
let mut default_sample_duration = 0;
|
||||||
|
let mut default_sample_size = 0;
|
||||||
if let Some(ref moov) = moov {
|
if let Some(ref moov) = moov {
|
||||||
if let Some(ref mvex) = &moov.mvex {
|
if let Some(ref mvex) = &moov.mvex {
|
||||||
default_sample_duration = mvex.trex.default_sample_duration
|
default_sample_duration = mvex.trex.default_sample_duration;
|
||||||
|
default_sample_size = mvex.trex.default_sample_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +111,7 @@ impl<R: Read + Seek> Mp4Reader<R> {
|
||||||
let track_id = traf.tfhd.track_id;
|
let track_id = traf.tfhd.track_id;
|
||||||
if let Some(track) = tracks.get_mut(&track_id) {
|
if let Some(track) = tracks.get_mut(&track_id) {
|
||||||
track.default_sample_duration = default_sample_duration;
|
track.default_sample_duration = default_sample_duration;
|
||||||
|
track.default_sample_size = default_sample_size;
|
||||||
track.moof_offsets.push(moof_offset);
|
track.moof_offsets.push(moof_offset);
|
||||||
track.trafs.push(traf.clone())
|
track.trafs.push(traf.clone())
|
||||||
} else {
|
} else {
|
||||||
|
|
26
src/track.rs
26
src/track.rs
|
@ -97,6 +97,7 @@ pub struct Mp4Track {
|
||||||
|
|
||||||
// Fragmented Tracks Defaults.
|
// Fragmented Tracks Defaults.
|
||||||
pub default_sample_duration: u32,
|
pub default_sample_duration: u32,
|
||||||
|
pub default_sample_size: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Track {
|
impl Mp4Track {
|
||||||
|
@ -107,6 +108,7 @@ impl Mp4Track {
|
||||||
trafs: Vec::new(),
|
trafs: Vec::new(),
|
||||||
moof_offsets: Vec::new(),
|
moof_offsets: Vec::new(),
|
||||||
default_sample_duration: 0,
|
default_sample_duration: 0,
|
||||||
|
default_sample_size: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,7 +263,7 @@ impl Mp4Track {
|
||||||
|
|
||||||
pub fn sequence_parameter_set(&self) -> Result<&[u8]> {
|
pub fn sequence_parameter_set(&self) -> Result<&[u8]> {
|
||||||
if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 {
|
if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 {
|
||||||
match avc1.avcc.sequence_parameter_sets.get(0) {
|
match avc1.avcc.sequence_parameter_sets.first() {
|
||||||
Some(nal) => Ok(nal.bytes.as_ref()),
|
Some(nal) => Ok(nal.bytes.as_ref()),
|
||||||
None => Err(Error::EntryInStblNotFound(
|
None => Err(Error::EntryInStblNotFound(
|
||||||
self.track_id(),
|
self.track_id(),
|
||||||
|
@ -276,7 +278,7 @@ impl Mp4Track {
|
||||||
|
|
||||||
pub fn picture_parameter_set(&self) -> Result<&[u8]> {
|
pub fn picture_parameter_set(&self) -> Result<&[u8]> {
|
||||||
if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 {
|
if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 {
|
||||||
match avc1.avcc.picture_parameter_sets.get(0) {
|
match avc1.avcc.picture_parameter_sets.first() {
|
||||||
Some(nal) => Ok(nal.bytes.as_ref()),
|
Some(nal) => Ok(nal.bytes.as_ref()),
|
||||||
None => Err(Error::EntryInStblNotFound(
|
None => Err(Error::EntryInStblNotFound(
|
||||||
self.track_id(),
|
self.track_id(),
|
||||||
|
@ -389,21 +391,19 @@ impl Mp4Track {
|
||||||
fn sample_size(&self, sample_id: u32) -> Result<u32> {
|
fn sample_size(&self, sample_id: u32) -> Result<u32> {
|
||||||
if !self.trafs.is_empty() {
|
if !self.trafs.is_empty() {
|
||||||
if let Some((traf_idx, sample_idx)) = self.find_traf_idx_and_sample_idx(sample_id) {
|
if let Some((traf_idx, sample_idx)) = self.find_traf_idx_and_sample_idx(sample_id) {
|
||||||
if let Some(size) = self.trafs[traf_idx]
|
let mut default_sample_size = self.default_sample_size;
|
||||||
|
let traf = &self.trafs[traf_idx];
|
||||||
|
if let Some(size) = traf.tfhd.default_sample_size {
|
||||||
|
default_sample_size = size;
|
||||||
|
}
|
||||||
|
if let Some(size) = traf
|
||||||
.trun
|
.trun
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.unwrap()
|
.and_then(|trun| trun.sample_sizes.get(sample_idx))
|
||||||
.sample_sizes
|
|
||||||
.get(sample_idx)
|
|
||||||
{
|
{
|
||||||
Ok(*size)
|
default_sample_size = *size;
|
||||||
} else {
|
|
||||||
Err(Error::EntryInTrunNotFound(
|
|
||||||
self.track_id(),
|
|
||||||
BoxType::TrunBox,
|
|
||||||
sample_id,
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
Ok(default_sample_size)
|
||||||
} else {
|
} else {
|
||||||
Err(Error::BoxInTrafNotFound(self.track_id(), BoxType::TrafBox))
|
Err(Error::BoxInTrafNotFound(self.track_id(), BoxType::TrafBox))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue