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 "OMXVideoDecoderMPEG4.h" 22e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 23e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu// Be sure to have an equal string in VideoDecoderHost.cpp (libmix) 24e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiustatic const char* MPEG4_MIME_TYPE = "video/mpeg4"; 25e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 26e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoDecoderMPEG4::OMXVideoDecoderMPEG4() { 27e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGV("OMXVideoDecoderMPEG4 is constructed."); 28e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mVideoDecoder = createVideoDecoder(MPEG4_MIME_TYPE); 29e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu if (!mVideoDecoder) { 30e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGE("createVideoDecoder failed for \"%s\"", MPEG4_MIME_TYPE); 31e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu } 328483e61c67457f8dd5c998492dcaf8d9af275452ywan mNativeBufferCount = OUTPORT_NATIVE_BUFFER_COUNT; 33e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu BuildHandlerList(); 34e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 35e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 36e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoDecoderMPEG4::~OMXVideoDecoderMPEG4() { 37e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGV("OMXVideoDecoderMPEG4 is destructed."); 38e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 39e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 40e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::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)MPEG4_MIME_TYPE; 46e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionInput->format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4; 47e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 48e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_VIDEO_PARAM_MPEG4TYPE 49e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mParamMpeg4, 0, sizeof(mParamMpeg4)); 50e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mParamMpeg4, sizeof(mParamMpeg4)); 51e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamMpeg4.nPortIndex = INPORT_INDEX; 52e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: check eProfile/eLevel 53e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamMpeg4.eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; //OMX_VIDEO_MPEG4ProfileSimple; 54e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamMpeg4.eLevel = OMX_VIDEO_MPEG4Level3; 55e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 56e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 57e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 58e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 59e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::ProcessorInit(void) { 60e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::ProcessorInit(); 61e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 62e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 63e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::ProcessorDeinit(void) { 64e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::ProcessorDeinit(); 65e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 66e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 67e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::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 OMXVideoDecoderMPEG4::PrepareConfigBuffer(VideoConfigBuffer *p) { 76e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::PrepareConfigBuffer(p); 77e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 78e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 79e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::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 OMXVideoDecoderMPEG4::BuildHandlerList(void) { 84e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMXVideoDecoderBase::BuildHandlerList(); 85e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler(OMX_IndexParamVideoMpeg4, GetParamVideoMpeg4, SetParamVideoMpeg4); 866bc8d027bb46c0638d26b3f755350b84f6325de3wfeng AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetParamVideoMpeg4ProfileLevel, SetParamVideoMpeg4ProfileLevel); 87e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 88e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 89e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 90e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::GetParamVideoMpeg4(OMX_PTR pStructure) { 91e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 92e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_MPEG4TYPE *p = (OMX_VIDEO_PARAM_MPEG4TYPE *)pStructure; 93e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 94e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, INPORT_INDEX); 95e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 96e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(p, &mParamMpeg4, sizeof(*p)); 97e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 98e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 99e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 100e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::SetParamVideoMpeg4(OMX_PTR pStructure) { 101e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 102e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_MPEG4TYPE *p = (OMX_VIDEO_PARAM_MPEG4TYPE *)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 SetPortMpeg4Param implementation - Can we make simple copy???? 109e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(&mParamMpeg4, p, sizeof(mParamMpeg4)); 110e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 111e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 112e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 1136bc8d027bb46c0638d26b3f755350b84f6325de3wfengOMX_ERRORTYPE OMXVideoDecoderMPEG4::GetParamVideoMpeg4ProfileLevel(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_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3}, 12354272c0e474f97ac0269706170eb9161b36a9170wgu {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5} 12454272c0e474f97ac0269706170eb9161b36a9170wgu }; 12554272c0e474f97ac0269706170eb9161b36a9170wgu 12654272c0e474f97ac0269706170eb9161b36a9170wgu OMX_U32 count = sizeof(plTable)/sizeof(ProfileLevelTable); 12754272c0e474f97ac0269706170eb9161b36a9170wgu CHECK_ENUMERATION_RANGE(p->nProfileIndex,count); 12854272c0e474f97ac0269706170eb9161b36a9170wgu 12954272c0e474f97ac0269706170eb9161b36a9170wgu p->eProfile = plTable[p->nProfileIndex].profile; 13054272c0e474f97ac0269706170eb9161b36a9170wgu p->eLevel = plTable[p->nProfileIndex].level; 1316bc8d027bb46c0638d26b3f755350b84f6325de3wfeng 1326bc8d027bb46c0638d26b3f755350b84f6325de3wfeng return OMX_ErrorNone; 1336bc8d027bb46c0638d26b3f755350b84f6325de3wfeng} 1346bc8d027bb46c0638d26b3f755350b84f6325de3wfeng 1350541f11be2f78b558476772f1f877e140f9d844bywanOMX_ERRORTYPE OMXVideoDecoderMPEG4::SetParamVideoMpeg4ProfileLevel(OMX_PTR) { 1366bc8d027bb46c0638d26b3f755350b84f6325de3wfeng LOGW("SetParamVideoMpeg4ProfileLevel is not supported."); 1376bc8d027bb46c0638d26b3f755350b84f6325de3wfeng return OMX_ErrorUnsupportedSetting; 1386bc8d027bb46c0638d26b3f755350b84f6325de3wfeng} 139e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 1400541f11be2f78b558476772f1f877e140f9d844bywanOMX_COLOR_FORMATTYPE OMXVideoDecoderMPEG4::GetOutputColorFormat(int width) 14194733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX{ 14294733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX#ifdef USE_GEN_HW 14394733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX return (OMX_COLOR_FORMATTYPE)HAL_PIXEL_FORMAT_NV12_X_TILED_INTEL; 14494733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX#else 1450541f11be2f78b558476772f1f877e140f9d844bywan return OMXVideoDecoderBase::GetOutputColorFormat(width); 14694733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX#endif 14794733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX} 14894733f48696cae1d610bf80c3127a464dc82c5f9Tang, XiaoxiX 1496c36d9722df768cfe63e015193459d870f3cdaa9Tianmi ChenOMX_ERRORTYPE OMXVideoDecoderMPEG4::SetMaxOutputBufferCount(OMX_PARAM_PORTDEFINITIONTYPE *p) { 1506c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen OMX_ERRORTYPE ret; 1516c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen CHECK_TYPE_HEADER(p); 1526c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen CHECK_PORT_INDEX(p, OUTPORT_INDEX); 1536c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen 1546c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen p->nBufferCountActual = OUTPORT_NATIVE_BUFFER_COUNT; 1556c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen return OMXVideoDecoderBase::SetMaxOutputBufferCount(p); 1566c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen} 1576c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen 158e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuDECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.MPEG4", "video_decoder.mpeg4", OMXVideoDecoderMPEG4); 159e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 160e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 161