From 6047352c9126f335c32dd3b845997c3260b9a617 Mon Sep 17 00:00:00 2001 From: Anthony Jones Date: Thu, 11 Sep 2014 15:57:33 +1200 Subject: [PATCH] Bug 1061079 - Make BufferStream work for a moving window; r=edwin --- media/libstagefright/binding/BufferStream.cpp | 37 +++++++++++++++---- media/libstagefright/binding/MoofParser.cpp | 9 ++++- .../include/mp4_demuxer/BufferStream.h | 13 +++++-- .../binding/include/mp4_demuxer/MoofParser.h | 3 +- .../binding/include/mp4_demuxer/mp4_demuxer.h | 2 + 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/media/libstagefright/binding/BufferStream.cpp b/media/libstagefright/binding/BufferStream.cpp index 80107b2a073d..6b78321b4bde 100644 --- a/media/libstagefright/binding/BufferStream.cpp +++ b/media/libstagefright/binding/BufferStream.cpp @@ -3,33 +3,56 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mp4_demuxer/BufferStream.h" +#include "MediaResource.h" #include +using namespace mozilla; + namespace mp4_demuxer { -BufferStream::BufferStream(const uint8_t* aData, size_t aLength) - : mData(aData), mLength(aLength) +BufferStream::BufferStream() + : mStartOffset(0) { - } /*virtual*/ bool BufferStream::ReadAt(int64_t aOffset, void* aData, size_t aLength, size_t* aBytesRead) { - if (aOffset > mLength) { + if (aOffset < mStartOffset || aOffset > mStartOffset + mData.Length()) { return false; } - *aBytesRead = std::min(aLength, mLength - (size_t) aOffset); - memcpy(aData, mData + aOffset, *aBytesRead); + *aBytesRead = + std::min(aLength, size_t(mStartOffset + mData.Length() - aOffset)); + memcpy(aData, &mData[aOffset - mStartOffset], *aBytesRead); return true; } /*virtual*/ bool BufferStream::Length(int64_t* aLength) { - *aLength = mLength; + *aLength = mStartOffset + mData.Length(); return true; } +/* virtual */ void +BufferStream::DiscardBefore(int64_t aOffset) +{ + if (aOffset > mStartOffset) { + mData.RemoveElementsAt(0, aOffset - mStartOffset); + mStartOffset = aOffset; + } +} + +void +BufferStream::AppendBytes(const uint8_t* aData, size_t aLength) +{ + mData.AppendElements(aData, aLength); +} + +MediaByteRange +BufferStream::GetByteRange() +{ + return MediaByteRange(mStartOffset, mStartOffset + mData.Length()); +} } diff --git a/media/libstagefright/binding/MoofParser.cpp b/media/libstagefright/binding/MoofParser.cpp index a71dc3c7282e..520f3a183532 100644 --- a/media/libstagefright/binding/MoofParser.cpp +++ b/media/libstagefright/binding/MoofParser.cpp @@ -37,11 +37,16 @@ MoofParser::RebuildFragmentedIndex(const nsTArray& aByteRanges) } Interval -MoofParser::GetCompositionRange() +MoofParser::GetCompositionRange(const nsTArray& aByteRanges) { Interval compositionRange; + BoxContext context(mSource, aByteRanges); for (size_t i = 0; i < mMoofs.Length(); i++) { - compositionRange = compositionRange.Extents(mMoofs[i].mTimeRange); + Moof& moof = mMoofs[i]; + Box box(&context, moof.mRange.mStart); + if (box.IsAvailable()) { + compositionRange = compositionRange.Extents(moof.mTimeRange); + } } return compositionRange; } diff --git a/media/libstagefright/binding/include/mp4_demuxer/BufferStream.h b/media/libstagefright/binding/include/mp4_demuxer/BufferStream.h index d8a9bb6307a1..e54a88135e3d 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/BufferStream.h +++ b/media/libstagefright/binding/include/mp4_demuxer/BufferStream.h @@ -6,6 +6,7 @@ #define BUFFER_STREAM_H_ #include "mp4_demuxer/mp4_demuxer.h" +#include "nsTArray.h" namespace mp4_demuxer { @@ -15,15 +16,21 @@ public: /* BufferStream does not take ownership of aData nor does it make a copy. * Therefore BufferStream shouldn't get used after aData is destroyed. */ - BufferStream(const uint8_t* aData, size_t aLength); + BufferStream(); virtual bool ReadAt(int64_t aOffset, void* aData, size_t aLength, size_t* aBytesRead) MOZ_OVERRIDE; virtual bool Length(int64_t* aLength) MOZ_OVERRIDE; + virtual void DiscardBefore(int64_t aOffset) MOZ_OVERRIDE; + + void AppendBytes(const uint8_t* aData, size_t aLength); + + mozilla::MediaByteRange GetByteRange(); + private: - const uint8_t* mData; - size_t mLength; + int64_t mStartOffset; + nsTArray mData; }; } diff --git a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h index 1d06718a926f..629c0750ef6f 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h +++ b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h @@ -131,7 +131,8 @@ public: } void RebuildFragmentedIndex( const nsTArray& aByteRanges); - Interval GetCompositionRange(); + Interval GetCompositionRange( + const nsTArray& aByteRanges); bool ReachedEnd(); void ParseMoov(Box& aBox); void ParseTrak(Box& aBox); diff --git a/media/libstagefright/binding/include/mp4_demuxer/mp4_demuxer.h b/media/libstagefright/binding/include/mp4_demuxer/mp4_demuxer.h index dfa21243229e..dfdca6d1d4e3 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/mp4_demuxer.h +++ b/media/libstagefright/binding/include/mp4_demuxer/mp4_demuxer.h @@ -28,6 +28,8 @@ public: size_t* bytes_read) = 0; virtual bool Length(int64_t* size) = 0; + virtual void DiscardBefore(int64_t offset) {} + protected: virtual ~Stream() {} };