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