OMXVideoDecoderMPEG4.cpp revision b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7
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 19e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu#define LOG_TAG "OMXVideoDecoderMPEG4" 20e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu#include <utils/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 } 32e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu BuildHandlerList(); 33e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 34e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 35e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoDecoderMPEG4::~OMXVideoDecoderMPEG4() { 36e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGV("OMXVideoDecoderMPEG4 is destructed."); 37e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 38e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 39e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput) { 40e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_PARAM_PORTDEFINITIONTYPE 41e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionInput->nBufferCountActual = INPORT_ACTUAL_BUFFER_COUNT; 42e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionInput->nBufferCountMin = INPORT_MIN_BUFFER_COUNT; 43e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionInput->nBufferSize = INPORT_BUFFER_SIZE; 44e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionInput->format.video.cMIMEType = (OMX_STRING)MPEG4_MIME_TYPE; 45e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionInput->format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4; 46e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 47e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_VIDEO_PARAM_MPEG4TYPE 48e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mParamMpeg4, 0, sizeof(mParamMpeg4)); 49e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mParamMpeg4, sizeof(mParamMpeg4)); 50e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamMpeg4.nPortIndex = INPORT_INDEX; 51e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: check eProfile/eLevel 52e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamMpeg4.eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; //OMX_VIDEO_MPEG4ProfileSimple; 53e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamMpeg4.eLevel = OMX_VIDEO_MPEG4Level3; 54e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 55e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 56e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 57e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 58e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::ProcessorInit(void) { 59e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::ProcessorInit(); 60e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 61e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 62e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::ProcessorDeinit(void) { 63e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::ProcessorDeinit(); 64e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 65e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 66e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::ProcessorProcess( 67b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao OMX_BUFFERHEADERTYPE ***pBuffers, 68e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu buffer_retain_t *retains, 69e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_U32 numberBuffers) { 70e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 71b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers); 72e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 73e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 74e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::PrepareConfigBuffer(VideoConfigBuffer *p) { 75e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::PrepareConfigBuffer(p); 76e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 77e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 78e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p) { 79e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::PrepareDecodeBuffer(buffer, retain, p); 80e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 81e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 82e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::BuildHandlerList(void) { 83e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMXVideoDecoderBase::BuildHandlerList(); 84e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler(OMX_IndexParamVideoMpeg4, GetParamVideoMpeg4, SetParamVideoMpeg4); 85b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer),GetNativeBufferMode,SetNativeBufferMode); 86e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 87e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 88e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 89e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::GetParamVideoMpeg4(OMX_PTR pStructure) { 90e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 91e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_MPEG4TYPE *p = (OMX_VIDEO_PARAM_MPEG4TYPE *)pStructure; 92e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 93e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, INPORT_INDEX); 94e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 95e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(p, &mParamMpeg4, sizeof(*p)); 96e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 97e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 98e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 99e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderMPEG4::SetParamVideoMpeg4(OMX_PTR pStructure) { 100e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 101e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_MPEG4TYPE *p = (OMX_VIDEO_PARAM_MPEG4TYPE *)pStructure; 102e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 103e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, INPORT_INDEX); 104e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_PARAM_STATE(); 105e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 106e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: do we need to check if port is enabled? 107e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: see SetPortMpeg4Param implementation - Can we make simple copy???? 108e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(&mParamMpeg4, p, sizeof(mParamMpeg4)); 109e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 110e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 111b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiaoOMX_ERRORTYPE OMXVideoDecoderMPEG4::GetNativeBufferMode(OMX_PTR pStructure) { 112b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao OMX_ERRORTYPE ret; 113b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao return OMX_ErrorNone; //would not be here 114b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao} 115b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao 116b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao 117b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao#define MAX_OUTPUT_BUFFER_COUNT_FOR_MPEG4 10 118b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiaoOMX_ERRORTYPE OMXVideoDecoderMPEG4::SetNativeBufferMode(OMX_PTR pStructure) { 119b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao OMX_ERRORTYPE ret; 120b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao //EnableAndroidNativeBuffersParams *param = (EnableAndroidNativeBuffersParams*)pStructure; 121b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao //CHECK_TYPE_HEADER(param); 122b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao CHECK_SET_PARAM_STATE(); 123b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao mNativeBufferMode = true; 124b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao PortVideo *port = NULL; 125b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); 126b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao OMX_PARAM_PORTDEFINITIONTYPE port_def; 127b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def)); 128b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao port_def.nBufferCountMin = 1; 129b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao port_def.nBufferCountActual = MAX_OUTPUT_BUFFER_COUNT_FOR_MPEG4; 130b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao port_def.format.video.cMIMEType = (OMX_STRING)VA_VED_RAW_MIME_TYPE; 131b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao port_def.format.video.eColorFormat =static_cast<OMX_COLOR_FORMATTYPE>(VA_VED_COLOR_FORMAT); 132b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao port->SetPortDefinition(&port_def,true); 133b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao return OMX_ErrorNone; 134b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao} 135e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 136e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 137e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuDECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.MPEG4", "video_decoder.mpeg4", OMXVideoDecoderMPEG4); 138e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 139e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 140