From 8cfee64c42e7ff2e0f46f06895c48fe5cfa82ce6 Mon Sep 17 00:00:00 2001 From: trav90 Date: Wed, 23 Nov 2016 08:21:20 -0600 Subject: [PATCH] Properly set dts on plain MP4 media This fixes a problem of frames being displayed out of order with some versions of LibAV/FFmpeg. --- media/libstagefright/binding/Index.cpp | 1 + media/libstagefright/binding/MP4Metadata.cpp | 1 + media/libstagefright/binding/include/mp4_demuxer/Index.h | 1 + .../frameworks/av/include/media/stagefright/MediaSource.h | 1 + .../frameworks/av/media/libstagefright/MPEG4Extractor.cpp | 4 +++- 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/media/libstagefright/binding/Index.cpp b/media/libstagefright/binding/Index.cpp index c399b7f88e..61158cad70 100644 --- a/media/libstagefright/binding/Index.cpp +++ b/media/libstagefright/binding/Index.cpp @@ -255,6 +255,7 @@ Index::Index(const nsTArray& aIndex, indice.end_offset); sample.mCompositionRange = Interval(indice.start_composition, indice.end_composition); + sample.mDecodeTime = indice.start_decode; sample.mSync = indice.sync; MOZ_ALWAYS_TRUE(mIndex.AppendElement(sample)); } diff --git a/media/libstagefright/binding/MP4Metadata.cpp b/media/libstagefright/binding/MP4Metadata.cpp index f163d679a0..9306bb530e 100644 --- a/media/libstagefright/binding/MP4Metadata.cpp +++ b/media/libstagefright/binding/MP4Metadata.cpp @@ -80,6 +80,7 @@ ConvertIndex(FallibleTArray& aDest, indice.end_offset = s_indice.end_offset; indice.start_composition = s_indice.start_composition; indice.end_composition = s_indice.end_composition; + indice.start_decode = s_indice.start_decode; indice.sync = s_indice.sync; MOZ_ALWAYS_TRUE(aDest.AppendElement(indice)); } diff --git a/media/libstagefright/binding/include/mp4_demuxer/Index.h b/media/libstagefright/binding/include/mp4_demuxer/Index.h index b8d27b1d66..c958a35a89 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/Index.h +++ b/media/libstagefright/binding/include/mp4_demuxer/Index.h @@ -50,6 +50,7 @@ public: uint64_t end_offset; uint64_t start_composition; uint64_t end_composition; + uint64_t start_decode; bool sync; }; diff --git a/media/libstagefright/frameworks/av/include/media/stagefright/MediaSource.h b/media/libstagefright/frameworks/av/include/media/stagefright/MediaSource.h index 60473bf87f..aebab442f8 100644 --- a/media/libstagefright/frameworks/av/include/media/stagefright/MediaSource.h +++ b/media/libstagefright/frameworks/av/include/media/stagefright/MediaSource.h @@ -116,6 +116,7 @@ struct MediaSource : public virtual RefBase { uint64_t end_offset; uint64_t start_composition; uint64_t end_composition; + uint64_t start_decode; bool sync; }; diff --git a/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp index f01fb18602..a4e4aa8e74 100644 --- a/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp @@ -4150,9 +4150,10 @@ nsTArray MPEG4Source::exportIndex() uint32_t compositionTime; uint32_t duration; bool isSyncSample; + uint32_t decodeTime; if (mSampleTable->getMetaDataForSample(sampleIndex, &offset, &size, &compositionTime, &duration, - &isSyncSample) != OK) { + &isSyncSample, &decodeTime) != OK) { ALOGE("Unexpected sample table problem"); continue; } @@ -4166,6 +4167,7 @@ nsTArray MPEG4Source::exportIndex() indice.end_composition = (compositionTime * 1000000ll + duration * 1000000ll) / mTimescale; indice.sync = isSyncSample; + indice.start_decode = (decodeTime * 1000000ll) / mTimescale; MOZ_ALWAYS_TRUE(index.AppendElement(indice)); }