summaryrefslogtreecommitdiffstats
path: root/dom/media/encoder/EncodedFrameContainer.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/encoder/EncodedFrameContainer.h')
-rw-r--r--dom/media/encoder/EncodedFrameContainer.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/dom/media/encoder/EncodedFrameContainer.h b/dom/media/encoder/EncodedFrameContainer.h
new file mode 100644
index 000000000..8b7512466
--- /dev/null
+++ b/dom/media/encoder/EncodedFrameContainer.h
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* 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 EncodedFrameContainer_H_
+#define EncodedFrameContainer_H_
+
+#include "nsTArray.h"
+
+namespace mozilla {
+
+class EncodedFrame;
+
+/*
+ * This container is used to carry video or audio encoded data from encoder to muxer.
+ * The media data object is created by encoder and recycle by the destructor.
+ * Only allow to store audio or video encoded data in EncodedData.
+ */
+class EncodedFrameContainer
+{
+public:
+ // Append encoded frame data
+ void AppendEncodedFrame(EncodedFrame* aEncodedFrame)
+ {
+ mEncodedFrames.AppendElement(aEncodedFrame);
+ }
+ // Retrieve all of the encoded frames
+ const nsTArray<RefPtr<EncodedFrame> >& GetEncodedFrames() const
+ {
+ return mEncodedFrames;
+ }
+private:
+ // This container is used to store the video or audio encoded packets.
+ // Muxer should check mFrameType and get the encoded data type from mEncodedFrames.
+ nsTArray<RefPtr<EncodedFrame> > mEncodedFrames;
+};
+
+// Represent one encoded frame
+class EncodedFrame final
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(EncodedFrame)
+public:
+ EncodedFrame() :
+ mTimeStamp(0),
+ mDuration(0),
+ mFrameType(UNKNOWN)
+ {}
+ enum FrameType {
+ VP8_I_FRAME, // VP8 intraframe
+ VP8_P_FRAME, // VP8 predicted frame
+ OPUS_AUDIO_FRAME, // Opus audio frame
+ VORBIS_AUDIO_FRAME,
+ AVC_I_FRAME,
+ AVC_P_FRAME,
+ AVC_B_FRAME,
+ AVC_CSD, // AVC codec specific data
+ AAC_AUDIO_FRAME,
+ AAC_CSD, // AAC codec specific data
+ AMR_AUDIO_CSD,
+ AMR_AUDIO_FRAME,
+ EVRC_AUDIO_CSD,
+ EVRC_AUDIO_FRAME,
+ UNKNOWN // FrameType not set
+ };
+ void SwapInFrameData(nsTArray<uint8_t>& aData)
+ {
+ mFrameData.SwapElements(aData);
+ }
+ nsresult SwapOutFrameData(nsTArray<uint8_t>& aData)
+ {
+ if (mFrameType != UNKNOWN) {
+ // Reset this frame type to UNKNOWN once the data is swapped out.
+ mFrameData.SwapElements(aData);
+ mFrameType = UNKNOWN;
+ return NS_OK;
+ }
+ return NS_ERROR_FAILURE;
+ }
+ const nsTArray<uint8_t>& GetFrameData() const
+ {
+ return mFrameData;
+ }
+ uint64_t GetTimeStamp() const { return mTimeStamp; }
+ void SetTimeStamp(uint64_t aTimeStamp) { mTimeStamp = aTimeStamp; }
+
+ uint64_t GetDuration() const { return mDuration; }
+ void SetDuration(uint64_t aDuration) { mDuration = aDuration; }
+
+ FrameType GetFrameType() const { return mFrameType; }
+ void SetFrameType(FrameType aFrameType) { mFrameType = aFrameType; }
+private:
+ // Private destructor, to discourage deletion outside of Release():
+ ~EncodedFrame()
+ {
+ }
+
+ // Encoded data
+ nsTArray<uint8_t> mFrameData;
+ uint64_t mTimeStamp;
+ // The playback duration of this packet in number of samples
+ uint64_t mDuration;
+ // Represent what is in the FrameData
+ FrameType mFrameType;
+};
+
+} // namespace mozilla
+
+#endif