зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1061079 - Make BufferStream work for a moving window; r=edwin
This commit is contained in:
Родитель
ba9a83aded
Коммит
6047352c91
|
@ -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() {}
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче