Bug 1061079 - Make BufferStream work for a moving window; r=edwin

This commit is contained in:
Anthony Jones 2014-09-11 15:57:33 +12:00
Родитель ba9a83aded
Коммит 6047352c91
5 изменённых файлов: 51 добавлений и 13 удалений

Просмотреть файл

@ -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 <algorithm>
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());
}
}

Просмотреть файл

@ -37,11 +37,16 @@ MoofParser::RebuildFragmentedIndex(const nsTArray<MediaByteRange>& aByteRanges)
}
Interval<Microseconds>
MoofParser::GetCompositionRange()
MoofParser::GetCompositionRange(const nsTArray<MediaByteRange>& aByteRanges)
{
Interval<Microseconds> 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;
}

Просмотреть файл

@ -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<uint8_t> mData;
};
}

Просмотреть файл

@ -131,7 +131,8 @@ public:
}
void RebuildFragmentedIndex(
const nsTArray<mozilla::MediaByteRange>& aByteRanges);
Interval<Microseconds> GetCompositionRange();
Interval<Microseconds> GetCompositionRange(
const nsTArray<mozilla::MediaByteRange>& aByteRanges);
bool ReachedEnd();
void ParseMoov(Box& aBox);
void ParseTrak(Box& aBox);

Просмотреть файл

@ -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() {}
};