SoftVideoDecoderOMXComponent.h revision bf220f3e6e799f28d1599c3c5106e9e15631a91d
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,
647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const char *mimeType);
657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
66bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    virtual void updatePortDefinitions(bool updateCrop = true);
67bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
68bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void handlePortSettingsChange(
69bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            bool *portWillReset, uint32_t width, uint32_t height, bool cropChanged = false);
70bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
71bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    void copyYV12FrameToOutputBuffer(
72bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV,
73bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            size_t srcYStride, size_t srcUStride, size_t srcVStride);
747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kInputPortIndex  = 0,
777f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kOutputPortIndex = 1,
787f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        kMaxPortIndex = 1,
797f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    };
807f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
81031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    bool mIsAdaptive;
82031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight;
837f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mWidth, mHeight;
847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight;
857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    enum {
877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        NONE,
887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_DISABLED,
897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        AWAITING_ENABLED
907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    } mOutputPortSettingsChange;
917f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
927f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprivate:
937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const char *mComponentRole;
947f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    OMX_VIDEO_CODINGTYPE mCodingType;
957f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    const CodecProfileLevel *mProfileLevels;
967f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    size_t mNumProfileLevels;
977f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent);
997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar};
1007f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}  // namespace android
1027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1037f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#endif  // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
104