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