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 "OMXVideoDecoderWMV.h" 22e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 23e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu// Be sure to have an equal string in VideoDecoderHost.cpp (libmix) 24e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiustatic const char* WMV_MIME_TYPE = "video/wmv"; 25e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 26e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoDecoderWMV::OMXVideoDecoderWMV() { 27e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGV("OMXVideoDecoderWMV is constructed."); 28e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mVideoDecoder = createVideoDecoder(WMV_MIME_TYPE); 29e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu if (!mVideoDecoder) { 30e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGE("createVideoDecoder failed for \"%s\"", WMV_MIME_TYPE); 31e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu } 3203118b9de04779e0aca0da6fe6fe5b0b0704a11cTianmi Chen mNativeBufferCount = OUTPORT_NATIVE_BUFFER_COUNT; 33e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu BuildHandlerList(); 34e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 35e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 36e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoDecoderWMV::~OMXVideoDecoderWMV() { 37e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGV("OMXVideoDecoderWMV is destructed."); 38e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 39e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 40e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::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)WMV_MIME_TYPE; 46e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionInput->format.video.eCompressionFormat = OMX_VIDEO_CodingWMV; 47e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 48e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_VIDEO_PARAM_WMVTYPE 49e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mParamWmv, 0, sizeof(mParamWmv)); 50e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mParamWmv, sizeof(mParamWmv)); 51e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamWmv.nPortIndex = INPORT_INDEX; 52e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamWmv.eFormat = OMX_VIDEO_WMVFormat9; 53e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 54e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 55e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 56e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 57e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::ProcessorInit(void) { 58e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::ProcessorInit(); 59e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 60e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 61e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::ProcessorDeinit(void) { 62e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::ProcessorDeinit(); 63e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 64e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 65e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::ProcessorProcess( 66b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao OMX_BUFFERHEADERTYPE ***pBuffers, 67e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu buffer_retain_t *retains, 68e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_U32 numberBuffers) { 69e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 70b2257cdcf3ffd7a4a7dedbe4842185689bcf7fb7xiao return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers); 71e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 72e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 73e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::PrepareConfigBuffer(VideoConfigBuffer *p) { 74e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::PrepareConfigBuffer(p); 75e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 76e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 77e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p) { 78e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoDecoderBase::PrepareDecodeBuffer(buffer, retain, p); 79e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 80e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 81e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::BuildHandlerList(void) { 82e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMXVideoDecoderBase::BuildHandlerList(); 83e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler(OMX_IndexParamVideoWmv, GetParamVideoWmv, SetParamVideoWmv); 84e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 85e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 86e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 87e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::GetParamVideoWmv(OMX_PTR pStructure) { 88e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 89e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_WMVTYPE *p = (OMX_VIDEO_PARAM_WMVTYPE *)pStructure; 90e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 91e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, INPORT_INDEX); 92e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 93e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(p, &mParamWmv, sizeof(*p)); 94e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 95e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 96e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 97e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoDecoderWMV::SetParamVideoWmv(OMX_PTR pStructure) { 98e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 99e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_WMVTYPE *p = (OMX_VIDEO_PARAM_WMVTYPE *)pStructure; 100e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 101e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, INPORT_INDEX); 102e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_PARAM_STATE(); 103e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 104e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: do we need to check if port is enabled? 105e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(&mParamWmv, p, sizeof(mParamWmv)); 106e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 107e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 108e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 1090541f11be2f78b558476772f1f877e140f9d844bywanOMX_COLOR_FORMATTYPE OMXVideoDecoderWMV::GetOutputColorFormat(int width) 11073cebb604e43c066d2d31eb145f82fc3080db532wfeng{ 11173cebb604e43c066d2d31eb145f82fc3080db532wfeng#ifdef USE_GEN_HW 11273cebb604e43c066d2d31eb145f82fc3080db532wfeng return OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled; 11373cebb604e43c066d2d31eb145f82fc3080db532wfeng#else 1140541f11be2f78b558476772f1f877e140f9d844bywan return OMXVideoDecoderBase::GetOutputColorFormat(width); 11573cebb604e43c066d2d31eb145f82fc3080db532wfeng#endif 11673cebb604e43c066d2d31eb145f82fc3080db532wfeng} 117e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 1186c36d9722df768cfe63e015193459d870f3cdaa9Tianmi ChenOMX_ERRORTYPE OMXVideoDecoderWMV::SetMaxOutputBufferCount(OMX_PARAM_PORTDEFINITIONTYPE *p) { 1196c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen OMX_ERRORTYPE ret; 1206c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen CHECK_TYPE_HEADER(p); 1216c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen CHECK_PORT_INDEX(p, OUTPORT_INDEX); 1226c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen 1236c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen p->nBufferCountActual = OUTPORT_NATIVE_BUFFER_COUNT; 1246c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen return OMXVideoDecoderBase::SetMaxOutputBufferCount(p); 1256c36d9722df768cfe63e015193459d870f3cdaa9Tianmi Chen} 126e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuDECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.WMV", "video_decoder.wmv", OMXVideoDecoderWMV); 127