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