diff --git a/README.md b/README.md index c348ffb6e..b0c9bcdfb 100755 --- a/README.md +++ b/README.md @@ -208,6 +208,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-12-17, Fix [#1548][bug #1548], Add edts in MP4 for Windows10. 3.0.154 * v3.0, 2020-10-31, [3.0 release2(3.0.153)][r3.0r2] released. 122663 lines. * v3.0, 2020-10-31, Fix [#509][bug #509], Always malloc stack on heap. 3.0.153 * v3.0, 2020-10-31, Remove some global elements for debugging. 3.0.152 @@ -1782,6 +1783,7 @@ Winlin [bug #1629]: https://github.com/ossrs/srs/issues/1629 [bug #1780]: https://github.com/ossrs/srs/issues/1780 [bug #1987]: https://github.com/ossrs/srs/issues/1987 +[bug #1548]: https://github.com/ossrs/srs/issues/1548 [bug #yyyyyyyyyyyyy]: https://github.com/ossrs/srs/issues/yyyyyyyyyyyyy [bug #1631]: https://github.com/ossrs/srs/issues/1631 diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index 37451726f..12949ebd1 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 153 +#define SRS_VERSION3_REVISION 154 #endif diff --git a/trunk/src/kernel/srs_kernel_mp4.cpp b/trunk/src/kernel/srs_kernel_mp4.cpp index e754a0c83..969c38568 100644 --- a/trunk/src/kernel/srs_kernel_mp4.cpp +++ b/trunk/src/kernel/srs_kernel_mp4.cpp @@ -1758,6 +1758,12 @@ void SrsMp4TrackBox::set_tkhd(SrsMp4TrackHeaderBox* v) boxes.insert(boxes.begin(), v); } +void SrsMp4TrackBox::set_edts(SrsMp4EditBox* v) +{ + remove(SrsMp4BoxTypeEDTS); + boxes.insert(boxes.begin(), v); +} + SrsMp4ChunkOffsetBox* SrsMp4TrackBox::stco() { SrsMp4SampleTableBox* box = stbl(); @@ -2022,6 +2028,12 @@ SrsMp4EditBox::~SrsMp4EditBox() { } +void SrsMp4EditBox::set_elst(SrsMp4EditListBox* v) +{ + remove(SrsMp4BoxTypeELST); + boxes.insert(boxes.begin(), v); +} + SrsMp4ElstEntry::SrsMp4ElstEntry() : segment_duration(0), media_time(0), media_rate_integer(0) { media_rate_fraction = 0; @@ -2744,12 +2756,10 @@ SrsMp4DataEntryBox* SrsMp4DataReferenceBox::entry_at(int index) return entries.at(index); } -void SrsMp4DataReferenceBox::append(SrsMp4Box* v) +// Note that box must be SrsMp4DataEntryBox* +void SrsMp4DataReferenceBox::append(SrsMp4Box* box) { - SrsMp4DataEntryBox* pv = dynamic_cast(v); - if (pv) { - entries.push_back(pv); - } + entries.push_back((SrsMp4DataEntryBox*)box); } int SrsMp4DataReferenceBox::nb_header() @@ -3767,12 +3777,10 @@ SrsMp4SampleEntry* SrsMp4SampleDescriptionBox::entrie_at(int index) return entries.at(index); } -void SrsMp4SampleDescriptionBox::append(SrsMp4Box* v) +// Note that box must be SrsMp4SampleEntry* +void SrsMp4SampleDescriptionBox::append(SrsMp4Box* box) { - SrsMp4SampleEntry* pv = dynamic_cast(v); - if (pv) { - entries.push_back(pv); - } + entries.push_back((SrsMp4SampleEntry*)box); } int SrsMp4SampleDescriptionBox::nb_header() @@ -5779,6 +5787,18 @@ srs_error_t SrsMp4Encoder::flush() if (nb_videos || !pavcc.empty()) { SrsMp4TrackBox* trak = new SrsMp4TrackBox(); moov->add_trak(trak); + + SrsMp4EditBox* edts = new SrsMp4EditBox(); + trak->set_edts(edts); + + SrsMp4EditListBox* elst = new SrsMp4EditListBox(); + edts->set_elst(elst); + elst->version = 0; + + SrsMp4ElstEntry entry; + entry.segment_duration = mvhd->duration_in_tbn; + entry.media_rate_integer = 1; + elst->entries.push_back(entry); SrsMp4TrackHeaderBox* tkhd = new SrsMp4TrackHeaderBox(); trak->set_tkhd(tkhd); diff --git a/trunk/src/kernel/srs_kernel_mp4.hpp b/trunk/src/kernel/srs_kernel_mp4.hpp index 8f3142029..655f452ae 100644 --- a/trunk/src/kernel/srs_kernel_mp4.hpp +++ b/trunk/src/kernel/srs_kernel_mp4.hpp @@ -71,6 +71,8 @@ class SrsMp4TrackFragmentBox; class SrsMp4TrackFragmentHeaderBox; class SrsMp4TrackFragmentDecodeTimeBox; class SrsMp4TrackFragmentRunBox; +class SrsMp4EditBox; +class SrsMp4EditListBox; // 4.2 Object Structure // ISO_IEC_14496-12-base-format-2012.pdf, page 16 @@ -766,6 +768,8 @@ public: // Get the track header box. virtual SrsMp4TrackHeaderBox* tkhd(); virtual void set_tkhd(SrsMp4TrackHeaderBox* v); + // Set the EDTS box. + virtual void set_edts(SrsMp4EditBox* v); public: // Get the chunk offset box. virtual SrsMp4ChunkOffsetBox* stco(); @@ -874,6 +878,8 @@ class SrsMp4EditBox : public SrsMp4Box public: SrsMp4EditBox(); virtual ~SrsMp4EditBox(); +public: + virtual void set_elst(SrsMp4EditListBox* v); }; // 8.6.6 Edit List Box @@ -1173,7 +1179,8 @@ public: public: virtual uint32_t entry_count(); virtual SrsMp4DataEntryBox* entry_at(int index); - virtual void append(SrsMp4Box* v); + // Note that box must be SrsMp4DataEntryBox* + virtual void append(SrsMp4Box* box); protected: virtual int nb_header(); virtual srs_error_t encode_header(SrsBuffer* buf); @@ -1520,7 +1527,8 @@ public: public: virtual uint32_t entry_count(); virtual SrsMp4SampleEntry* entrie_at(int index); - virtual void append(SrsMp4Box* v); + // Note that box must be SrsMp4SampleEntry* + virtual void append(SrsMp4Box* box); protected: virtual int nb_header(); virtual srs_error_t encode_header(SrsBuffer* buf);