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>
247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/IOMX.h>
257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/RefBase.h>
277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/threads.h>
287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/Vector.h>
297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarnamespace android {
317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarstruct SoftVideoDecoderOMXComponent : public SimpleSoftOMXComponent {
337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    SoftVideoDecoderOMXComponent(
347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const char *name,
357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const char *componentRole,
367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_VIDEO_CODINGTYPE codingType,
377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const CodecProfileLevel *profileLevels,
387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            size_t numProfileLevels,
397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            int32_t width,
407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            int32_t height,
417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const OMX_CALLBACKTYPE *callbacks,
427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_PTR appData,
437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_COMPONENTTYPE **component);
447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprotected:
467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual void onReset();
487f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
497f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual OMX_ERRORTYPE internalGetParameter(
507f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_INDEXTYPE index, OMX_PTR params);
517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual OMX_ERRORTYPE internalSetParameter(
537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_INDEXTYPE index, const OMX_PTR params);
547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
557f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    virtual OMX_ERRORTYPE getConfig(
567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_INDEXTYPE index, OMX_PTR params);
577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
58031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    virtual OMX_ERRORTYPE getExtensionIndex(
59031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            const char *name, OMX_INDEXTYPE *index);
60031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    void initPorts(OMX_U32 numInputBuffers,
627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_U32 inputBufferSize,
637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_U32 numOutputBuffers,
64a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            const char *mimeType,
65a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            OMX_U32 minCompressionRatio = 1u);
667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
67a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    virtual void updatePortDefinitions(bool updateCrop = true, bool updateInputSize = false);
68bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
691aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    uint32_t outputBufferWidth();
701aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    uint32_t outputBufferHeight();
711aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu
72d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu    enum CropSettingsMode {
73d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropUnSet = 0,
74d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropSet,
75d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu        kCropChanged,
76d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu    };
77bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void handlePortSettingsChange(
78a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu            bool *portWillReset, uint32_t width, uint32_t height,
79d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu            CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false);
80bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
81bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void copyYV12FrameToOutputBuffer(
82bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV,
83bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            size_t srcYStride, size_t srcUStride, size_t srcVStride);
847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kInputPortIndex  = 0,
877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kOutputPortIndex = 1,
887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kMaxPortIndex = 1,
897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    };
907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
91031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    bool mIsAdaptive;
92031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight;
937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mWidth, mHeight;
947f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight;
957f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
967f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
977f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        NONE,
987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_DISABLED,
997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_ENABLED
1007f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    } mOutputPortSettingsChange;
1017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprivate:
103a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinInputBufferSize;
104a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinCompressionRatio;
105a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
1067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const char *mComponentRole;
1077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    OMX_VIDEO_CODINGTYPE mCodingType;
1087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const CodecProfileLevel *mProfileLevels;
1097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    size_t mNumProfileLevels;
1107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent);
1127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar};
1137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}  // namespace android
1157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#endif  // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
117