1e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu/*
2e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
3e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu*
4e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* Licensed under the Apache License, Version 2.0 (the "License");
5e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* you may not use this file except in compliance with the License.
6e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* You may obtain a copy of the License at
7e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu*
8e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* http://www.apache.org/licenses/LICENSE-2.0
9e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu*
10e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* Unless required by applicable law or agreed to in writing, software
11e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* distributed under the License is distributed on an "AS IS" BASIS,
12e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* See the License for the specific language governing permissions and
14e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* limitations under the License.
15e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu*/
16e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
17e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
18e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu// #define LOG_NDEBUG 0
19bcabe3079546f97c7e2dc72886e55fabaff51848Andy Qiu#define LOG_TAG "OMXVideoDecoder"
2026a110c2a29667599733db5173a751e670b366a5Thierry Strudel#include <wrs_omxil_core/log.h>
21e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu#include "OMXVideoDecoderH263.h"
22e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
23e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu// Be sure to have an equal string in VideoDecoderHost.cpp (libmix)
24e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiustatic const char* H263_MIME_TYPE = "video/h263";
25e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
26e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoDecoderH263::OMXVideoDecoderH263() {
27e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    LOGV("OMXVideoDecoderH263 is constructed.");
28e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mVideoDecoder = createVideoDecoder(H263_MIME_TYPE);
29e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    if (!mVideoDecoder) {
30e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        LOGE("createVideoDecoder failed for \"%s\"", H263_MIME_TYPE);
31e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    }
3203118b9de04779e0aca0da6fe6fe5b0b0704a11cTianmi Chen    mNativeBufferCount = OUTPORT_NATIVE_BUFFER_COUNT;
33e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    BuildHandlerList();
34e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
35e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
36e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoDecoderH263::~OMXVideoDecoderH263() {
37e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    LOGV("OMXVideoDecoderH263 is destructed.");
38e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
39e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
40e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput) {
41e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // OMX_PARAM_PORTDEFINITIONTYPE
42e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionInput->nBufferCountActual = INPORT_ACTUAL_BUFFER_COUNT;
43e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionInput->nBufferCountMin = INPORT_MIN_BUFFER_COUNT;
44e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionInput->nBufferSize = INPORT_BUFFER_SIZE;
45e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionInput->format.video.cMIMEType = (OMX_STRING)H263_MIME_TYPE;
46e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionInput->format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
47e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
48e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // OMX_VIDEO_PARAM_H263TYPE
49e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memset(&mParamH263, 0, sizeof(mParamH263));
50e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    SetTypeHeader(&mParamH263, sizeof(mParamH263));
51e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamH263.nPortIndex = INPORT_INDEX;
52e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: check eProfile/eLevel
53e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline;
54e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamH263.eLevel = OMX_VIDEO_H263Level70; //OMX_VIDEO_H263Level10;
55e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
56e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
57e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
58e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
59e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::ProcessorInit(void) {
60e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMXVideoDecoderBase::ProcessorInit();
61e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
62e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
63e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::ProcessorDeinit(void) {
64e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMXVideoDecoderBase::ProcessorDeinit();
65e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
66e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
67e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::ProcessorProcess(
68b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao        OMX_BUFFERHEADERTYPE ***pBuffers,
69e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        buffer_retain_t *retains,
70e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        OMX_U32 numberBuffers) {
71e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
72b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao    return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
73e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
74e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
75e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::PrepareConfigBuffer(VideoConfigBuffer *p) {
76e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMXVideoDecoderBase::PrepareConfigBuffer(p);
77e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
78e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
79e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p) {
80e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMXVideoDecoderBase::PrepareDecodeBuffer(buffer, retain, p);
81e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
82e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
83e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::BuildHandlerList(void) {
84e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMXVideoDecoderBase::BuildHandlerList();
85e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler(OMX_IndexParamVideoH263, GetParamVideoH263, SetParamVideoH263);
866bc8d027bb46c0638d26b3f755350b84f6325de3wfeng    AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetParamVideoH263ProfileLevel, SetParamVideoH263ProfileLevel);
87e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
88e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
89e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
90e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::GetParamVideoH263(OMX_PTR pStructure) {
91e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
92e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_PARAM_H263TYPE *p = (OMX_VIDEO_PARAM_H263TYPE *)pStructure;
93e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
94e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, INPORT_INDEX);
95e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
96e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memcpy(p, &mParamH263, sizeof(*p));
97e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
98e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
99e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
100e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderH263::SetParamVideoH263(OMX_PTR pStructure) {
101e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
102e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_PARAM_H263TYPE *p = (OMX_VIDEO_PARAM_H263TYPE *)pStructure;
103e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
104e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, INPORT_INDEX);
105e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_SET_PARAM_STATE();
106e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
107e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: do we need to check if port is enabled?
108e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: see SetPortH263Param implementation - Can we make simple copy????
109e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memcpy(&mParamH263, p, sizeof(mParamH263));
110e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
111e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
112e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1136bc8d027bb46c0638d26b3f755350b84f6325de3wfengOMX_ERRORTYPE OMXVideoDecoderH263::GetParamVideoH263ProfileLevel(OMX_PTR pStructure) {
1146bc8d027bb46c0638d26b3f755350b84f6325de3wfeng    OMX_ERRORTYPE ret;
1156bc8d027bb46c0638d26b3f755350b84f6325de3wfeng    OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
1166bc8d027bb46c0638d26b3f755350b84f6325de3wfeng    CHECK_TYPE_HEADER(p);
1176bc8d027bb46c0638d26b3f755350b84f6325de3wfeng
11854272c0e474f97ac0269706170eb9161b36a9170wgu    struct ProfileLevelTable {
11954272c0e474f97ac0269706170eb9161b36a9170wgu        OMX_U32 profile;
12054272c0e474f97ac0269706170eb9161b36a9170wgu        OMX_U32 level;
12154272c0e474f97ac0269706170eb9161b36a9170wgu    } plTable[] = {
12254272c0e474f97ac0269706170eb9161b36a9170wgu        {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70}
12354272c0e474f97ac0269706170eb9161b36a9170wgu    };
12454272c0e474f97ac0269706170eb9161b36a9170wgu
12554272c0e474f97ac0269706170eb9161b36a9170wgu    OMX_U32 count = sizeof(plTable)/sizeof(ProfileLevelTable);
12654272c0e474f97ac0269706170eb9161b36a9170wgu    CHECK_ENUMERATION_RANGE(p->nProfileIndex,count);
12754272c0e474f97ac0269706170eb9161b36a9170wgu
12854272c0e474f97ac0269706170eb9161b36a9170wgu    p->eProfile = plTable[p->nProfileIndex].profile;
12954272c0e474f97ac0269706170eb9161b36a9170wgu    p->eLevel = plTable[p->nProfileIndex].level;
1306bc8d027bb46c0638d26b3f755350b84f6325de3wfeng
1316bc8d027bb46c0638d26b3f755350b84f6325de3wfeng    return OMX_ErrorNone;
1326bc8d027bb46c0638d26b3f755350b84f6325de3wfeng}
1336bc8d027bb46c0638d26b3f755350b84f6325de3wfeng
1340541f11be2f78b558476772f1f877e140f9d844bywanOMX_ERRORTYPE OMXVideoDecoderH263::SetParamVideoH263ProfileLevel(OMX_PTR) {
1356bc8d027bb46c0638d26b3f755350b84f6325de3wfeng    LOGW("SetParamVideoH263ProfileLevel is not supported.");
1366bc8d027bb46c0638d26b3f755350b84f6325de3wfeng    return OMX_ErrorUnsupportedSetting;
1376bc8d027bb46c0638d26b3f755350b84f6325de3wfeng}
138e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1390541f11be2f78b558476772f1f877e140f9d844bywanOMX_COLOR_FORMATTYPE OMXVideoDecoderH263::GetOutputColorFormat(int width)
14094733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX{
14194733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX#ifdef USE_GEN_HW
14294733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX    return (OMX_COLOR_FORMATTYPE)HAL_PIXEL_FORMAT_NV12_X_TILED_INTEL;
14394733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX#else
1440541f11be2f78b558476772f1f877e140f9d844bywan    return OMXVideoDecoderBase::GetOutputColorFormat(width);
14594733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX#endif
14694733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX}
14794733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX
1486c36d9722df768cfe63e015193459d870f3cdaa9Tianmi ChenOMX_ERRORTYPE OMXVideoDecoderH263::SetMaxOutputBufferCount(OMX_PARAM_PORTDEFINITIONTYPE *p) {
1496c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen    OMX_ERRORTYPE ret;
1506c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen    CHECK_TYPE_HEADER(p);
1516c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
1526c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen
1536c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen    p->nBufferCountActual = OUTPORT_NATIVE_BUFFER_COUNT;
1546c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen    return OMXVideoDecoderBase::SetMaxOutputBufferCount(p);
1556c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen}
1566c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen
157e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuDECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.H263", "video_decoder.h263", OMXVideoDecoderH263);
158e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
159