diff --git a/lib/mp4_generic.cpp b/lib/mp4_generic.cpp index c08b5e70..4243cbc2 100644 --- a/lib/mp4_generic.cpp +++ b/lib/mp4_generic.cpp @@ -3197,57 +3197,57 @@ namespace MP4 { void ELST::setSegmentDuration(uint32_t cnt, uint64_t newVal) { if (getVersion() == 1) { - setInt64(newVal, 28*cnt+8); + setInt64(newVal, 20*cnt+8); } else { - setInt32(newVal, 20*cnt+8); + setInt32(newVal, 12*cnt+8); } } uint64_t ELST::getSegmentDuration(uint32_t cnt) { if (getVersion() == 1) { - return getInt64(28*cnt+8); + return getInt64(20*cnt+8); } else { - return getInt32(20*cnt+8); + return getInt32(12*cnt+8); } } void ELST::setMediaTime(uint32_t cnt, uint64_t newVal) { if (getVersion() == 1) { - setInt64(newVal, 28*cnt+16); + setInt64(newVal, 20*cnt+16); } else { - setInt32(newVal, 20*cnt+12); + setInt32(newVal, 12*cnt+12); } } uint64_t ELST::getMediaTime(uint32_t cnt) { if (getVersion() == 1) { - return getInt64(28*cnt+16); + return getInt64(20*cnt+16); } else { - return getInt32(20*cnt+12); + return getInt32(12*cnt+12); } } void ELST::setMediaRateInteger(uint32_t cnt, uint16_t newVal) { if (getVersion() == 1) { - setInt16(newVal, 28*cnt+24); + setInt16(newVal, 20*cnt+24); } else { - setInt16(newVal, 20*cnt+16); + setInt16(newVal, 12*cnt+16); } } uint16_t ELST::getMediaRateInteger(uint32_t cnt) { if (getVersion() == 1) { - return getInt16(28*cnt+24); + return getInt16(20*cnt+24); } else { - return getInt16(20*cnt+16); + return getInt16(12*cnt+16); } } void ELST::setMediaRateFraction(uint32_t cnt, uint16_t newVal) { if (getVersion() == 1) { - setInt16(newVal, 28*cnt+26); + setInt16(newVal, 20*cnt+26); } else { - setInt16(newVal, 20*cnt+18); + setInt16(newVal, 12*cnt+18); } } diff --git a/src/output/output_progressive_mp4.cpp b/src/output/output_progressive_mp4.cpp index 699452bd..e96de3a5 100644 --- a/src/output/output_progressive_mp4.cpp +++ b/src/output/output_progressive_mp4.cpp @@ -40,6 +40,12 @@ namespace Mist { uint64_t res = 36 // FTYP Box + 8 //MOOV box + 108; //MVHD Box + uint64_t firstms = 0xFFFFFFFFFFFFFFFFull; + for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ + if (myMeta.tracks[*it].firstms < firstms){ + firstms = myMeta.tracks[*it].firstms; + } + } for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ DTSC::Track & thisTrack = myMeta.tracks[*it]; uint64_t tmpRes = 0; @@ -54,6 +60,9 @@ namespace Mist { + 8 //MINF Box + 36 //DINF Box + 8; // STBL Box + if (thisTrack.firstms != firstms){ + tmpRes += 12;// EDTS entry extra + } //These boxes are empty when generating fragmented output tmpRes += 20 + (partCount * 4);//STSZ @@ -140,7 +149,7 @@ namespace Mist { //Then override it to set the correct duration uint64_t firstms = 0xFFFFFFFFFFFFFFull; uint64_t lastms = 0; - for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++) { + for (std::set::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){ lastms = std::max(lastms, (uint64_t)myMeta.tracks[*it].lastms); firstms = std::min(firstms, (uint64_t)myMeta.tracks[*it].firstms); } @@ -171,6 +180,7 @@ namespace Mist { elstBox.setMediaTime(0, 0); elstBox.setMediaRateInteger(0, 1); elstBox.setMediaRateFraction(0, 0); + edtsBox.setContent(elstBox, 0); trakBox.setContent(edtsBox, trakOffset++);