1 /*
2 * Copyright (c) 2009-2011 Intel Corporation. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18 //#define LOG_NDEBUG 0
19 #define LOG_TAG "OMXVideoDecoder"
20 #include <wrs_omxil_core/log.h>
21 #include "OMXVideoDecoderPAVC.h"
22
23 // Be sure to have an equal string in VideoDecoderHost.cpp (libmix)
24 static const char* PAVC_MIME_TYPE = "video/PAVC";
25 #define INVALID_PTS (OMX_S64)-1
26
27
OMXVideoDecoderPAVC()28 OMXVideoDecoderPAVC::OMXVideoDecoderPAVC() {
29 LOGV("OMXVideoDecoderPAVC is constructed.");
30 mVideoDecoder = createVideoDecoder(PAVC_MIME_TYPE);
31 if (!mVideoDecoder) {
32 LOGE("createVideoDecoder failed for \"%s\"", PAVC_MIME_TYPE);
33 }
34
35 BuildHandlerList();
36 }
37
~OMXVideoDecoderPAVC()38 OMXVideoDecoderPAVC::~OMXVideoDecoderPAVC() {
39 LOGV("OMXVideoDecoderPAVC is destructed.");
40 }
41
InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE * paramPortDefinitionInput)42 OMX_ERRORTYPE OMXVideoDecoderPAVC::InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionInput) {
43 // OMX_PARAM_PORTDEFINITIONTYPE
44 paramPortDefinitionInput->nBufferCountActual = INPORT_ACTUAL_BUFFER_COUNT;
45 paramPortDefinitionInput->nBufferCountMin = INPORT_MIN_BUFFER_COUNT;
46 paramPortDefinitionInput->nBufferSize = INPORT_BUFFER_SIZE;
47 paramPortDefinitionInput->format.video.cMIMEType = (OMX_STRING)PAVC_MIME_TYPE;
48 paramPortDefinitionInput->format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
49
50 // OMX_VIDEO_PARAM_AVCTYPE
51 memset(&mParamAvc, 0, sizeof(mParamAvc));
52 SetTypeHeader(&mParamAvc, sizeof(mParamAvc));
53 mParamAvc.nPortIndex = INPORT_INDEX;
54 // TODO: check eProfile/eLevel
55 mParamAvc.eProfile = OMX_VIDEO_AVCProfileMain; //OMX_VIDEO_AVCProfileBaseline;
56 mParamAvc.eLevel = OMX_VIDEO_AVCLevel41; //OMX_VIDEO_AVCLevel1;
57
58 mCurrentProfile = mParamAvc.eProfile;
59 mCurrentLevel = mParamAvc.eLevel;
60
61 return OMX_ErrorNone;
62 }
63
ProcessorInit(void)64 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorInit(void) {
65 return OMXVideoDecoderBase::ProcessorInit();
66 }
67
ProcessorDeinit(void)68 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorDeinit(void) {
69 return OMXVideoDecoderBase::ProcessorDeinit();
70 }
71
ProcessorFlush(OMX_U32 portIndex)72 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorFlush(OMX_U32 portIndex) {
73 return OMXVideoDecoderBase::ProcessorFlush(portIndex);
74 }
75
ProcessorProcess(OMX_BUFFERHEADERTYPE *** pBuffers,buffer_retain_t * retains,OMX_U32 numberBuffers)76 OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorProcess(
77 OMX_BUFFERHEADERTYPE ***pBuffers,
78 buffer_retain_t *retains,
79 OMX_U32 numberBuffers) {
80
81 return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
82 }
83
PrepareConfigBuffer(VideoConfigBuffer * p)84 OMX_ERRORTYPE OMXVideoDecoderPAVC::PrepareConfigBuffer(VideoConfigBuffer *p) {
85 OMX_ERRORTYPE ret;
86 ret = OMXVideoDecoderBase::PrepareConfigBuffer(p);
87 CHECK_RETURN_VALUE("OMXVideoDecoderBase::PrepareConfigBuffer");
88 p->width = 1920;
89 p->height = 1088;
90 p->surfaceNumber = 16;
91 p->profile = VAProfileH264High;
92 p->flag = WANT_SURFACE_PROTECTION | HAS_VA_PROFILE | HAS_SURFACE_NUMBER;
93 return OMX_ErrorNone;
94 }
95
PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE * buffer,buffer_retain_t * retain,VideoDecodeBuffer * p)96 OMX_ERRORTYPE OMXVideoDecoderPAVC::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p) {
97 OMX_ERRORTYPE ret;
98 ret = OMXVideoDecoderBase::PrepareDecodeBuffer(buffer, retain, p);
99 CHECK_RETURN_VALUE("OMXVideoDecoderBase::PrepareDecodeBuffer");
100
101 // OMX_BUFFERFLAG_CODECCONFIG is an optional flag
102 // if flag is set, buffer will only contain codec data.
103 if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
104 LOGV("Received codec data for Protected AVC.");
105 return ret;
106 }
107
108 if (buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
109 p->flag |= HAS_EXTRADATA;
110 } else {
111 LOGW("No extra data found.");
112 }
113 return ret;
114 }
115
BuildHandlerList(void)116 OMX_ERRORTYPE OMXVideoDecoderPAVC::BuildHandlerList(void) {
117 OMXVideoDecoderBase::BuildHandlerList();
118 AddHandler(OMX_IndexParamVideoAvc, GetParamVideoAvc, SetParamVideoAvc);
119 AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetVideoProfileLevelQuerySupported, SetVideoProfileLevelQuerySupported);
120 AddHandler(OMX_IndexParamVideoProfileLevelCurrent, GetVideoProfileLevelCurrent, SetVideoProfileLevelCurrent);
121 return OMX_ErrorNone;
122 }
123
GetParamVideoAvc(OMX_PTR pStructure)124 OMX_ERRORTYPE OMXVideoDecoderPAVC::GetParamVideoAvc(OMX_PTR pStructure) {
125 OMX_ERRORTYPE ret;
126 OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure;
127 CHECK_TYPE_HEADER(p);
128 CHECK_PORT_INDEX(p, INPORT_INDEX);
129
130 memcpy(p, &mParamAvc, sizeof(*p));
131 return OMX_ErrorNone;
132 }
133
SetParamVideoAvc(OMX_PTR pStructure)134 OMX_ERRORTYPE OMXVideoDecoderPAVC::SetParamVideoAvc(OMX_PTR pStructure) {
135 OMX_ERRORTYPE ret;
136 OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure;
137 CHECK_TYPE_HEADER(p);
138 CHECK_PORT_INDEX(p, INPORT_INDEX);
139 CHECK_SET_PARAM_STATE();
140
141 // TODO: do we need to check if port is enabled?
142 // TODO: see SetPortAvcParam implementation - Can we make simple copy????
143 memcpy(&mParamAvc, p, sizeof(mParamAvc));
144 return OMX_ErrorNone;
145 }
146
GetVideoProfileLevelQuerySupported(OMX_PTR pStructure)147 OMX_ERRORTYPE OMXVideoDecoderPAVC::GetVideoProfileLevelQuerySupported(OMX_PTR pStructure) {
148 OMX_ERRORTYPE ret;
149 OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
150
151 CHECK_TYPE_HEADER(p);
152 CHECK_PORT_INDEX_RANGE(p);
153
154 if (p->nProfileIndex != 0) {
155 LOGE("No more profile index for GetVideoProfileLevelQuerySupported.");
156 return OMX_ErrorNoMore;
157 }
158 p->eProfile = mParamAvc.eProfile;
159 p->eLevel = mParamAvc.eLevel;
160
161 return OMX_ErrorNone;
162 }
163
SetVideoProfileLevelQuerySupported(OMX_PTR)164 OMX_ERRORTYPE OMXVideoDecoderPAVC::SetVideoProfileLevelQuerySupported(OMX_PTR) {
165 LOGE("SetVideoProfileLevelQuerySupported is not supported.");
166 return OMX_ErrorUnsupportedSetting;
167 }
168
GetVideoProfileLevelCurrent(OMX_PTR pStructure)169 OMX_ERRORTYPE OMXVideoDecoderPAVC::GetVideoProfileLevelCurrent(OMX_PTR pStructure) {
170 OMX_ERRORTYPE ret;
171 OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
172
173 CHECK_TYPE_HEADER(p);
174 CHECK_PORT_INDEX_RANGE(p);
175
176 if (p->nProfileIndex != 0) {
177 LOGE("No more profile index for GetVideoProfileLevelCurrent.");
178 return OMX_ErrorNoMore;
179 }
180
181 p->eProfile = mCurrentProfile;
182 p->eLevel = mCurrentLevel;
183
184 return OMX_ErrorNone;
185 }
186
SetVideoProfileLevelCurrent(OMX_PTR pStructure)187 OMX_ERRORTYPE OMXVideoDecoderPAVC::SetVideoProfileLevelCurrent(OMX_PTR pStructure) {
188 OMX_ERRORTYPE ret;
189 OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
190
191 CHECK_TYPE_HEADER(p);
192 CHECK_PORT_INDEX_RANGE(p);
193
194 if (p->nProfileIndex != 0) {
195 LOGE("Invalid profile index for SetVideoProfileLevelCurrent.");
196 return OMX_ErrorBadParameter;
197 }
198
199 mCurrentProfile = (OMX_VIDEO_AVCPROFILETYPE) p->eProfile;
200 mCurrentLevel = (OMX_VIDEO_AVCLEVELTYPE) p->eLevel;
201
202 return OMX_ErrorNone;
203 }
204
205 DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.PAVC", "video_decoder.pavc", OMXVideoDecoderPAVC);
206
207