17f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar/*
27f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * Copyright (C) 2013 The Android Open Source Project
37f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar *
47f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
57f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * you may not use this file except in compliance with the License.
67f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * You may obtain a copy of the License at
77f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar *
87f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
97f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar *
107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * Unless required by applicable law or agreed to in writing, software
117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * See the License for the specific language governing permissions and
147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * limitations under the License.
157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar */
167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#ifndef SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#define SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include "SimpleSoftOMXComponent.h"
227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/stagefright/foundation/AHandlerReflector.h>
24c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang#include <media/stagefright/foundation/ColorUtils.h>
257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/IOMX.h>
267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/RefBase.h>
287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/threads.h>
297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/Vector.h>
307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarnamespace android {
327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarstruct SoftVideoDecoderOMXComponent : public SimpleSoftOMXComponent {
347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    SoftVideoDecoderOMXComponent(
357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const char *name,
367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const char *componentRole,
377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_VIDEO_CODINGTYPE codingType,
387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const CodecProfileLevel *profileLevels,
397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            size_t numProfileLevels,
407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            int32_t width,
417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            int32_t height,
427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const OMX_CALLBACKTYPE *callbacks,
437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_PTR appData,
447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_COMPONENTTYPE **component);
457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprotected:
47c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    enum {
48c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        kDescribeColorAspectsIndex = kPrepareForAdaptivePlaybackIndex + 1,
49c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    };
50c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
51c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    enum {
52c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        kNotSupported,
53c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        kPreferBitstream,
54c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        kPreferContainer,
55c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    };
56c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual void onReset();
597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual OMX_ERRORTYPE internalGetParameter(
617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_INDEXTYPE index, OMX_PTR params);
627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual OMX_ERRORTYPE internalSetParameter(
647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_INDEXTYPE index, const OMX_PTR params);
657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual OMX_ERRORTYPE getConfig(
677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_INDEXTYPE index, OMX_PTR params);
687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
69c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    virtual OMX_ERRORTYPE setConfig(
70c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            OMX_INDEXTYPE index, const OMX_PTR params);
71c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
72031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    virtual OMX_ERRORTYPE getExtensionIndex(
73031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            const char *name, OMX_INDEXTYPE *index);
74031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
75c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    virtual bool supportsDescribeColorAspects();
76c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
77c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    virtual int getColorAspectPreference();
78c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
79a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    // This function sets both minimum buffer count and actual buffer count of
80a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    // input port to be |numInputBuffers|. It will also set both minimum buffer
81a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    // count and actual buffer count of output port to be |numOutputBuffers|.
827f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    void initPorts(OMX_U32 numInputBuffers,
837f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_U32 inputBufferSize,
847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_U32 numOutputBuffers,
85a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            const char *mimeType,
86a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            OMX_U32 minCompressionRatio = 1u);
877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
88a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    // This function sets input port's minimum buffer count to |numMinInputBuffers|,
89a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    // sets input port's actual buffer count to |numInputBuffers|, sets output port's
90a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    // minimum buffer count to |numMinOutputBuffers| and sets output port's actual buffer
91a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    // count to be |numOutputBuffers|.
92a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang    void initPorts(OMX_U32 numMinInputBuffers,
93a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            OMX_U32 numInputBuffers,
94a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            OMX_U32 inputBufferSize,
95a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            OMX_U32 numMinOutputBuffers,
96a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            OMX_U32 numOutputBuffers,
97a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            const char *mimeType,
98a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            OMX_U32 minCompressionRatio = 1u);
99a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang
100a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    virtual void updatePortDefinitions(bool updateCrop = true, bool updateInputSize = false);
101bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
1021aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    uint32_t outputBufferWidth();
1031aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    uint32_t outputBufferHeight();
1041aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu
105d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu    enum CropSettingsMode {
106d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropUnSet = 0,
107d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropSet,
108d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropChanged,
109d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu    };
110c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
111c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // This function will handle several port change events which include
112c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // size changed, crop changed, stride changed and coloraspects changed.
113c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // It will trigger OMX_EventPortSettingsChanged event if necessary.
114bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void handlePortSettingsChange(
115a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu            bool *portWillReset, uint32_t width, uint32_t height,
116d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu            CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false);
117bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
118bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void copyYV12FrameToOutputBuffer(
119bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV,
120bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            size_t srcYStride, size_t srcUStride, size_t srcVStride);
1217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
1237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kInputPortIndex  = 0,
1247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kOutputPortIndex = 1,
1257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kMaxPortIndex = 1,
1267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    };
1277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
128031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    bool mIsAdaptive;
129031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight;
1307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mWidth, mHeight;
1317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight;
1327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
1347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        NONE,
1357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_DISABLED,
1367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_ENABLED
1377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    } mOutputPortSettingsChange;
1387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
139c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    bool mUpdateColorAspects;
140c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
141c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    Mutex mColorAspectsLock;
142c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // color aspects passed from the framework.
143c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorAspects mDefaultColorAspects;
144c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // color aspects parsed from the bitstream.
145c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorAspects mBitstreamColorAspects;
146c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // final color aspects after combining the above two aspects.
147c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorAspects mFinalColorAspects;
148c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
149c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b);
150c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
151c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // This functions takes two color aspects and updates the mFinalColorAspects
152c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // based on |preferredAspects|.
153c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    void updateFinalColorAspects(
154c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            const ColorAspects &otherAspects, const ColorAspects &preferredAspects);
155c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
156c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // This function will update the mFinalColorAspects based on codec preference.
157c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    status_t handleColorAspectsChange();
158c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
159c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // Helper function to dump the ColorAspects.
160c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    void dumpColorAspects(const ColorAspects &colorAspects);
161c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
1627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprivate:
163a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinInputBufferSize;
164a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinCompressionRatio;
165a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
1667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const char *mComponentRole;
1677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    OMX_VIDEO_CODINGTYPE mCodingType;
1687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const CodecProfileLevel *mProfileLevels;
1697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    size_t mNumProfileLevels;
1707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent);
1727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar};
1737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}  // namespace android
1757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#endif  // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
177