summaryrefslogtreecommitdiffstats
path: root/dom/media/platforms/gonk/GonkVideoDecoderManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/platforms/gonk/GonkVideoDecoderManager.h')
-rw-r--r--dom/media/platforms/gonk/GonkVideoDecoderManager.h149
1 files changed, 149 insertions, 0 deletions
diff --git a/dom/media/platforms/gonk/GonkVideoDecoderManager.h b/dom/media/platforms/gonk/GonkVideoDecoderManager.h
new file mode 100644
index 000000000..343bb2a5c
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkVideoDecoderManager.h
@@ -0,0 +1,149 @@
+/* -*- 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/. */
+
+#if !defined(GonkVideoDecoderManager_h_)
+#define GonkVideoDecoderManager_h_
+
+#include "nsRect.h"
+#include "GonkMediaDataDecoder.h"
+#include "mozilla/RefPtr.h"
+#include "I420ColorConverterHelper.h"
+#include "MediaCodecProxy.h"
+#include "GonkNativeWindow.h"
+#include "mozilla/layers/FenceUtils.h"
+#include "mozilla/UniquePtr.h"
+#include <ui/Fence.h>
+
+using namespace android;
+
+namespace android {
+class MediaBuffer;
+struct MOZ_EXPORT AString;
+class GonkNativeWindow;
+} // namespace android
+
+namespace mozilla {
+
+namespace layers {
+class TextureClient;
+class TextureClientRecycleAllocator;
+} // namespace mozilla::layers
+
+class GonkVideoDecoderManager : public GonkDecoderManager {
+typedef android::MediaCodecProxy MediaCodecProxy;
+typedef mozilla::layers::TextureClient TextureClient;
+
+public:
+ GonkVideoDecoderManager(mozilla::layers::ImageContainer* aImageContainer,
+ const VideoInfo& aConfig);
+
+ virtual ~GonkVideoDecoderManager();
+
+ RefPtr<InitPromise> Init() override;
+
+ nsresult Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutput) override;
+
+ nsresult Shutdown() override;
+
+ const char* GetDescriptionName() const override
+ {
+ return "gonk video decoder";
+ }
+
+ static void RecycleCallback(TextureClient* aClient, void* aClosure);
+
+protected:
+ // Bug 1199809: workaround to avoid sending the graphic buffer by making a
+ // copy of output buffer after calling flush(). Bug 1203859 was created to
+ // reimplementing Gonk PDM on top of OpenMax IL directly. Its buffer
+ // management will work better with Gecko and solve problems like this.
+ void ProcessFlush() override
+ {
+ mNeedsCopyBuffer = true;
+ GonkDecoderManager::ProcessFlush();
+ }
+
+private:
+ struct FrameInfo
+ {
+ int32_t mWidth = 0;
+ int32_t mHeight = 0;
+ int32_t mStride = 0;
+ int32_t mSliceHeight = 0;
+ int32_t mColorFormat = 0;
+ int32_t mCropLeft = 0;
+ int32_t mCropTop = 0;
+ int32_t mCropRight = 0;
+ int32_t mCropBottom = 0;
+ };
+
+ void onMessageReceived(const android::sp<android::AMessage> &aMessage) override;
+
+ bool SetVideoFormat();
+
+ nsresult CreateVideoData(MediaBuffer* aBuffer, int64_t aStreamOffset, VideoData** aOutData);
+ already_AddRefed<VideoData> CreateVideoDataFromGraphicBuffer(android::MediaBuffer* aSource,
+ gfx::IntRect& aPicture);
+ already_AddRefed<VideoData> CreateVideoDataFromDataBuffer(android::MediaBuffer* aSource,
+ gfx::IntRect& aPicture);
+
+ uint8_t* GetColorConverterBuffer(int32_t aWidth, int32_t aHeight);
+
+ // For codec resource management
+ void codecReserved();
+ void codecCanceled();
+
+ void ReleaseAllPendingVideoBuffers();
+ void PostReleaseVideoBuffer(android::MediaBuffer *aBuffer,
+ layers::FenceHandle mReleaseFence);
+
+ VideoInfo mConfig;
+
+ RefPtr<layers::ImageContainer> mImageContainer;
+ RefPtr<layers::TextureClientRecycleAllocator> mCopyAllocator;
+
+ MozPromiseRequestHolder<android::MediaCodecProxy::CodecPromise> mVideoCodecRequest;
+ FrameInfo mFrameInfo;
+
+ // color converter
+ android::I420ColorConverterHelper mColorConverter;
+ UniquePtr<uint8_t[]> mColorConverterBuffer;
+ size_t mColorConverterBufferSize;
+
+ android::sp<android::GonkNativeWindow> mNativeWindow;
+#if ANDROID_VERSION >= 21
+ android::sp<android::IGraphicBufferProducer> mGraphicBufferProducer;
+#endif
+
+ enum {
+ kNotifyPostReleaseBuffer = 'nprb',
+ };
+
+ struct ReleaseItem {
+ ReleaseItem(android::MediaBuffer* aBuffer, layers::FenceHandle& aFence)
+ : mBuffer(aBuffer)
+ , mReleaseFence(aFence) {}
+ android::MediaBuffer* mBuffer;
+ layers::FenceHandle mReleaseFence;
+ };
+ nsTArray<ReleaseItem> mPendingReleaseItems;
+
+ // The lock protects mPendingReleaseItems.
+ Mutex mPendingReleaseItemsLock;
+
+ // This TaskQueue should be the same one in mDecodeCallback->OnReaderTaskQueue().
+ // It is for codec resource mangement, decoding task should not dispatch to it.
+ RefPtr<TaskQueue> mReaderTaskQueue;
+
+ // Bug 1199809: do we need to make a copy of output buffer? Used only when
+ // the decoder outputs graphic buffers.
+ bool mNeedsCopyBuffer;
+};
+
+} // namespace mozilla
+
+#endif // GonkVideoDecoderManager_h_