summaryrefslogtreecommitdiffstats
path: root/dom/media/mp4/Box.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/mp4/Box.h')
-rw-r--r--dom/media/mp4/Box.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/dom/media/mp4/Box.h b/dom/media/mp4/Box.h
new file mode 100644
index 0000000000..e63bfbcc90
--- /dev/null
+++ b/dom/media/mp4/Box.h
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef BOX_H_
+#define BOX_H_
+
+#include <stdint.h>
+#include "nsTArray.h"
+#include "MediaResource.h"
+#include "mozilla/EndianUtils.h"
+#include "AtomType.h"
+#include "BufferReader.h"
+
+namespace mozilla {
+class ByteStream;
+
+class BumpAllocator {
+ public:
+ uint8_t* Allocate(size_t aNumBytes);
+
+ private:
+ nsTArray<nsTArray<uint8_t>> mBuffers;
+};
+
+class BoxContext {
+ public:
+ BoxContext(ByteStream* aSource, const MediaByteRangeSet& aByteRanges)
+ : mSource(aSource), mByteRanges(aByteRanges) {}
+
+ RefPtr<ByteStream> mSource;
+ const MediaByteRangeSet& mByteRanges;
+ BumpAllocator mAllocator;
+};
+
+struct ByteSlice {
+ const uint8_t* mBytes;
+ size_t mSize;
+};
+
+class Box {
+ public:
+ Box(BoxContext* aContext, uint64_t aOffset, const Box* aParent = nullptr);
+ Box();
+
+ bool IsAvailable() const { return !mRange.IsEmpty(); }
+ uint64_t Offset() const { return mRange.mStart; }
+ uint64_t Length() const { return mRange.mEnd - mRange.mStart; }
+ uint64_t NextOffset() const { return mRange.mEnd; }
+ const MediaByteRange& Range() const { return mRange; }
+ const Box* Parent() const { return mParent; }
+ bool IsType(const char* aType) const { return mType == AtomType(aType); }
+
+ Box Next() const;
+ Box FirstChild() const;
+ // Reads the box contents, excluding the header.
+ nsTArray<uint8_t> Read() const;
+
+ // Reads the complete box; its header and body.
+ nsTArray<uint8_t> ReadCompleteBox() const;
+
+ // Reads from the content of the box, excluding header.
+ bool Read(nsTArray<uint8_t>* aDest, const MediaByteRange& aRange) const;
+
+ static const uint64_t kMAX_BOX_READ;
+
+ // Returns a slice, pointing to the data of this box. The lifetime of
+ // the memory this slice points to matches the box's context's lifetime.
+ ByteSlice ReadAsSlice();
+
+ private:
+ bool Contains(MediaByteRange aRange) const;
+ BoxContext* mContext;
+ mozilla::MediaByteRange mRange;
+ uint64_t mBodyOffset;
+ uint64_t mChildOffset;
+ AtomType mType;
+ const Box* mParent;
+};
+
+// BoxReader serves box data through an AutoByteReader. The box data is
+// stored either in the box's context's bump allocator, or in the ByteStream
+// itself if the ByteStream implements the Access() method.
+// NOTE: The data the BoxReader reads may be stored in the Box's BoxContext.
+// Ensure that the BoxReader doesn't outlive the BoxContext!
+class MOZ_RAII BoxReader {
+ public:
+ explicit BoxReader(Box& aBox)
+ : mData(aBox.ReadAsSlice()), mReader(mData.mBytes, mData.mSize) {}
+ BufferReader* operator->() { return &mReader; }
+
+ private:
+ ByteSlice mData;
+ BufferReader mReader;
+};
+} // namespace mozilla
+
+#endif