SoftVideoDecoderOMXComponent.h revision c2e98f5f60460890195b33abe40e376f800b242e
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
797f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    void initPorts(OMX_U32 numInputBuffers,
807f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_U32 inputBufferSize,
817f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_U32 numOutputBuffers,
82a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            const char *mimeType,
83a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            OMX_U32 minCompressionRatio = 1u);
847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
85a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    virtual void updatePortDefinitions(bool updateCrop = true, bool updateInputSize = false);
86bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
871aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    uint32_t outputBufferWidth();
881aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    uint32_t outputBufferHeight();
891aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu
90d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu    enum CropSettingsMode {
91d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropUnSet = 0,
92d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropSet,
93d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropChanged,
94d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu    };
95c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
96c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // This function will handle several port change events which include
97c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // size changed, crop changed, stride changed and coloraspects changed.
98c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // It will trigger OMX_EventPortSettingsChanged event if necessary.
99bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void handlePortSettingsChange(
100a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu            bool *portWillReset, uint32_t width, uint32_t height,
101d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu            CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false);
102bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
103bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void copyYV12FrameToOutputBuffer(
104bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV,
105bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            size_t srcYStride, size_t srcUStride, size_t srcVStride);
1067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
1087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kInputPortIndex  = 0,
1097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kOutputPortIndex = 1,
1107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kMaxPortIndex = 1,
1117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    };
1127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
113031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    bool mIsAdaptive;
114031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight;
1157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mWidth, mHeight;
1167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight;
1177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
1197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        NONE,
1207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_DISABLED,
1217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_ENABLED
1227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    } mOutputPortSettingsChange;
1237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
124c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    bool mUpdateColorAspects;
125c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
126c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    Mutex mColorAspectsLock;
127c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // color aspects passed from the framework.
128c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorAspects mDefaultColorAspects;
129c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // color aspects parsed from the bitstream.
130c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorAspects mBitstreamColorAspects;
131c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // final color aspects after combining the above two aspects.
132c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorAspects mFinalColorAspects;
133c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
134c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b);
135c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
136c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // This functions takes two color aspects and updates the mFinalColorAspects
137c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // based on |preferredAspects|.
138c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    void updateFinalColorAspects(
139c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            const ColorAspects &otherAspects, const ColorAspects &preferredAspects);
140c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
141c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // This function will update the mFinalColorAspects based on codec preference.
142c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    status_t handleColorAspectsChange();
143c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
144c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // Helper function to dump the ColorAspects.
145c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    void dumpColorAspects(const ColorAspects &colorAspects);
146c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
1477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprivate:
148a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinInputBufferSize;
149a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinCompressionRatio;
150a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
1517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const char *mComponentRole;
1527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    OMX_VIDEO_CODINGTYPE mCodingType;
1537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const CodecProfileLevel *mProfileLevels;
1547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    size_t mNumProfileLevels;
1557f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent);
1577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar};
1587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}  // namespace android
1607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#endif  // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
162