blob: 674fe93247b9c7ea7e65d03c26f314273620f222 [file] [log] [blame]
Shalaj Jain273b3e02012-06-22 19:08:03 -07001/*--------------------------------------------------------------------------
Maheshwar Ajja507d6552014-01-03 14:54:29 +05302Copyright (c) 2010 - 2014, The Linux Foundation. All rights reserved.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003
4Redistribution and use in source and binary forms, with or without
5modification, are permitted provided that the following conditions are met:
6 * Redistributions of source code must retain the above copyright
7 notice, this list of conditions and the following disclaimer.
8 * Redistributions in binary form must reproduce the above copyright
9 notice, this list of conditions and the following disclaimer in the
10 documentation and/or other materials provided with the distribution.
Vinay Kaliae4a7d9d2013-01-21 10:16:33 -080011 * Neither the name of The Linux Foundation nor
Shalaj Jain273b3e02012-06-22 19:08:03 -070012 the names of its contributors may be used to endorse or promote
13 products derived from this software without specific prior written
14 permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27--------------------------------------------------------------------------*/
28
29/*============================================================================
30 O p e n M A X w r a p p e r s
31 O p e n M A X C o r e
32
33*//** @file omx_vdec.cpp
34 This module contains the implementation of the OpenMAX core & component.
35
36*//*========================================================================*/
37
38//////////////////////////////////////////////////////////////////////////////
39// Include Files
40//////////////////////////////////////////////////////////////////////////////
41
Deva Ramasubramanianeb819322014-07-17 14:23:35 -070042#define __STDC_FORMAT_MACROS
43#include <inttypes.h>
44
Shalaj Jain273b3e02012-06-22 19:08:03 -070045#include <string.h>
46#include <pthread.h>
47#include <sys/prctl.h>
48#include <stdlib.h>
49#include <unistd.h>
50#include <errno.h>
51#include "omx_vdec.h"
52#include <fcntl.h>
53#include <limits.h>
Deva Ramasubramanian15bbc1c2013-05-13 16:05:03 -070054#include <stdlib.h>
Arun Menonbdb80b02013-08-12 17:45:54 -070055#include <media/hardware/HardwareAPI.h>
Vinay Kaliada8f3cf2012-12-21 18:26:21 -080056#include <media/msm_media_info.h>
Shalaj Jain273b3e02012-06-22 19:08:03 -070057
58#ifndef _ANDROID_
59#include <sys/ioctl.h>
60#include <sys/mman.h>
61#endif //_ANDROID_
62
63#ifdef _ANDROID_
64#include <cutils/properties.h>
65#undef USE_EGL_IMAGE_GPU
66#endif
67
Vinay Kalia0e75e9a2012-09-27 15:41:53 -070068#include <qdMetaData.h>
Shalaj Jain273b3e02012-06-22 19:08:03 -070069
70#ifdef _ANDROID_
71#include "DivXDrmDecrypt.h"
72#endif //_ANDROID_
73
Arun Menon45346052013-11-13 12:40:08 -080074#ifdef METADATA_FOR_DYNAMIC_MODE
Arun Menon9af783f2013-10-22 12:57:14 -070075#include "QComOMXMetadata.h"
76#endif
77
Shalaj Jain273b3e02012-06-22 19:08:03 -070078#ifdef USE_EGL_IMAGE_GPU
79#include <EGL/egl.h>
80#include <EGL/eglQCOM.h>
81#define EGL_BUFFER_HANDLE_QCOM 0x4F00
82#define EGL_BUFFER_OFFSET_QCOM 0x4F01
83#endif
Vinay Kalia21649b32013-03-18 17:28:07 -070084
Jayasena Sangaraboina51230642013-08-21 18:02:13 -070085#define BUFFER_LOG_LOC "/data/misc/media"
86
Shalaj Jain273b3e02012-06-22 19:08:03 -070087#ifdef OUTPUT_EXTRADATA_LOG
88FILE *outputExtradataFile;
Deva Ramasubramanianee6f1f42014-01-31 12:49:18 -080089char output_extradata_filename [] = "/data/misc/extradata";
Shalaj Jain273b3e02012-06-22 19:08:03 -070090#endif
91
92#define DEFAULT_FPS 30
Shalaj Jain273b3e02012-06-22 19:08:03 -070093#define MAX_SUPPORTED_FPS 120
Deepak Vermaa2efdb12013-12-26 12:30:05 +053094#define DEFAULT_WIDTH_ALIGNMENT 128
95#define DEFAULT_HEIGHT_ALIGNMENT 32
Shalaj Jain273b3e02012-06-22 19:08:03 -070096
97#define VC1_SP_MP_START_CODE 0xC5000000
98#define VC1_SP_MP_START_CODE_MASK 0xFF000000
99#define VC1_AP_SEQ_START_CODE 0x0F010000
100#define VC1_STRUCT_C_PROFILE_MASK 0xF0
101#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000
102#define VC1_SIMPLE_PROFILE 0
103#define VC1_MAIN_PROFILE 1
104#define VC1_ADVANCE_PROFILE 3
105#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0
106#define VC1_SIMPLE_PROFILE_MED_LEVEL 2
107#define VC1_STRUCT_C_LEN 4
108#define VC1_STRUCT_C_POS 8
109#define VC1_STRUCT_A_POS 12
110#define VC1_STRUCT_B_POS 24
111#define VC1_SEQ_LAYER_SIZE 36
Vinay Kaliab09886c2012-08-20 11:27:25 -0700112#define POLL_TIMEOUT 0x7fffffff
Shalaj Jain273b3e02012-06-22 19:08:03 -0700113
114#define MEM_DEVICE "/dev/ion"
115#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
116
117#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700118extern "C" {
119#include<utils/Log.h>
120}
Shalaj Jain273b3e02012-06-22 19:08:03 -0700121#endif//_ANDROID_
122
Vinay Kalia53fa6832012-10-11 17:55:30 -0700123#define SZ_4K 0x1000
124#define SZ_1M 0x100000
125
Shalaj Jain273b3e02012-06-22 19:08:03 -0700126#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } }
127#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); }
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700128#define EXTRADATA_IDX(__num_planes) (__num_planes - 1)
129
Vinay Kaliadb90f8c2012-11-19 18:57:56 -0800130#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
Jia Meng3a3c6492013-12-19 17:16:52 +0800131#define DEFAULT_CONCEAL_COLOR "32896" //0x8080, black by default
Jayasena Sangaraboinac4dfc282013-08-08 12:41:39 -0700132
133int debug_level = PRIO_ERROR;
134
Deepak Vermaa2efdb12013-12-26 12:30:05 +0530135static OMX_U32 maxSmoothStreamingWidth = 1920;
136static OMX_U32 maxSmoothStreamingHeight = 1088;
Praveen Chavancf924182013-12-06 23:16:23 -0800137
Shalaj Jain273b3e02012-06-22 19:08:03 -0700138void* async_message_thread (void *input)
139{
Arun Menon906de572013-06-18 17:01:40 -0700140 OMX_BUFFERHEADERTYPE *buffer;
141 struct v4l2_plane plane[VIDEO_MAX_PLANES];
142 struct pollfd pfd;
143 struct v4l2_buffer v4l2_buf;
144 memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
145 struct v4l2_event dqevent;
146 omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
147 pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
148 pfd.fd = omx->drv_ctx.video_driver_fd;
149 int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700150 DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
Arun Menon906de572013-06-18 17:01:40 -0700151 prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
152 while (1) {
153 rc = poll(&pfd, 1, POLL_TIMEOUT);
154 if (!rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700155 DEBUG_PRINT_ERROR("Poll timedout");
Arun Menon906de572013-06-18 17:01:40 -0700156 break;
157 } else if (rc < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700158 DEBUG_PRINT_ERROR("Error while polling: %d", rc);
Arun Menon906de572013-06-18 17:01:40 -0700159 break;
160 }
161 if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
162 struct vdec_msginfo vdec_msg;
163 v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
164 v4l2_buf.memory = V4L2_MEMORY_USERPTR;
165 v4l2_buf.length = omx->drv_ctx.num_planes;
166 v4l2_buf.m.planes = plane;
167 while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
168 vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
169 vdec_msg.status_code=VDEC_S_SUCCESS;
170 vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
171 vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
172 vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
173 vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
174 (uint64_t)v4l2_buf.timestamp.tv_usec;
175 if (vdec_msg.msgdata.output_frame.len) {
176 vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
177 vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
178 vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
179 vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +0530180 vdec_msg.msgdata.output_frame.picsize.frame_width = plane[0].reserved[6];
181 vdec_msg.msgdata.output_frame.picsize.frame_height = plane[0].reserved[7];
Arun Menon906de572013-06-18 17:01:40 -0700182 }
183 if (omx->async_message_process(input,&vdec_msg) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700184 DEBUG_PRINT_HIGH("async_message_thread Exited");
Arun Menon906de572013-06-18 17:01:40 -0700185 break;
186 }
187 }
188 }
189 if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
190 struct vdec_msginfo vdec_msg;
191 v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
192 v4l2_buf.memory = V4L2_MEMORY_USERPTR;
193 v4l2_buf.length = 1;
194 v4l2_buf.m.planes = plane;
195 while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
196 vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
197 vdec_msg.status_code=VDEC_S_SUCCESS;
198 vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
199 if (omx->async_message_process(input,&vdec_msg) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700200 DEBUG_PRINT_HIGH("async_message_thread Exited");
Arun Menon906de572013-06-18 17:01:40 -0700201 break;
202 }
203 }
204 }
205 if (pfd.revents & POLLPRI) {
206 rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
207 if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
208 struct vdec_msginfo vdec_msg;
209 vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
210 vdec_msg.status_code=VDEC_S_SUCCESS;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700211 DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved insufficient");
Arun Menon906de572013-06-18 17:01:40 -0700212 if (omx->async_message_process(input,&vdec_msg) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700213 DEBUG_PRINT_HIGH("async_message_thread Exited");
Arun Menon906de572013-06-18 17:01:40 -0700214 break;
215 }
216 } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
217 struct vdec_msginfo vdec_msg;
218 vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
219 vdec_msg.status_code=VDEC_S_SUCCESS;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700220 DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved");
Arun Menon906de572013-06-18 17:01:40 -0700221 if (omx->async_message_process(input,&vdec_msg) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700222 DEBUG_PRINT_HIGH("async_message_thread Exited");
Arun Menon906de572013-06-18 17:01:40 -0700223 break;
224 }
225 vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
226 vdec_msg.status_code=VDEC_S_SUCCESS;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700227 DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved");
Arun Menon906de572013-06-18 17:01:40 -0700228 if (omx->async_message_process(input,&vdec_msg) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700229 DEBUG_PRINT_HIGH("async_message_thread Exited");
Arun Menon906de572013-06-18 17:01:40 -0700230 break;
231 }
232 } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700233 DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited");
Arun Menon906de572013-06-18 17:01:40 -0700234 break;
Deepak Verma24720fb2014-01-29 16:57:40 +0530235 } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) {
236 struct vdec_msginfo vdec_msg;
237 vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD;
238 vdec_msg.status_code=VDEC_S_SUCCESS;
239 DEBUG_PRINT_ERROR("HW Overload received");
240 if (omx->async_message_process(input,&vdec_msg) < 0) {
241 DEBUG_PRINT_HIGH("async_message_thread Exited");
242 break;
243 }
Arun Menon906de572013-06-18 17:01:40 -0700244 } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
245 struct vdec_msginfo vdec_msg;
Jia Meng1e236c82014-04-03 10:54:39 +0800246 vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR;
247 vdec_msg.status_code = VDEC_S_SUCCESS;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700248 DEBUG_PRINT_HIGH("SYS Error Recieved");
Arun Menon906de572013-06-18 17:01:40 -0700249 if (omx->async_message_process(input,&vdec_msg) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700250 DEBUG_PRINT_HIGH("async_message_thread Exited");
Arun Menon906de572013-06-18 17:01:40 -0700251 break;
252 }
Arun Menon45346052013-11-13 12:40:08 -0800253 } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) {
Arun Menonbdb80b02013-08-12 17:45:54 -0700254 unsigned int *ptr = (unsigned int *)dqevent.u.data;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700255 DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]);
Arun Menonbdb80b02013-08-12 17:45:54 -0700256 omx->buf_ref_remove(ptr[0], ptr[1]);
257 } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) {
258 unsigned int *ptr = (unsigned int *)dqevent.u.data;
259 struct vdec_msginfo vdec_msg;
260
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700261 DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]);
Arun Menonbdb80b02013-08-12 17:45:54 -0700262
263 v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
264 v4l2_buf.memory = V4L2_MEMORY_USERPTR;
265 v4l2_buf.length = omx->drv_ctx.num_planes;
266 v4l2_buf.m.planes = plane;
267 v4l2_buf.index = ptr[5];
268 v4l2_buf.flags = 0;
269
270 vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
271 vdec_msg.status_code = VDEC_S_SUCCESS;
272 vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf;
273 vdec_msg.msgdata.output_frame.len = 0;
274 vdec_msg.msgdata.output_frame.bufferaddr = (void*)ptr[2];
275 vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) +
276 (uint64_t)ptr[4];
277 if (omx->async_message_process(input,&vdec_msg) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700278 DEBUG_PRINT_HIGH("async_message_thread Exitedn");
Arun Menonbdb80b02013-08-12 17:45:54 -0700279 break;
280 }
281 }
Arun Menonbdb80b02013-08-12 17:45:54 -0700282 else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700283 DEBUG_PRINT_HIGH("VIDC Some Event recieved");
Arun Menon906de572013-06-18 17:01:40 -0700284 continue;
285 }
286 }
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700287 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700288 DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
Arun Menon906de572013-06-18 17:01:40 -0700289 return NULL;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700290}
291
292void* message_thread(void *input)
293{
Arun Menon906de572013-06-18 17:01:40 -0700294 omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
295 unsigned char id;
296 int n;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700297
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700298 DEBUG_PRINT_HIGH("omx_vdec: message thread start");
Arun Menon906de572013-06-18 17:01:40 -0700299 prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
300 while (1) {
Shalaj Jain273b3e02012-06-22 19:08:03 -0700301
Arun Menon906de572013-06-18 17:01:40 -0700302 n = read(omx->m_pipe_in, &id, 1);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700303
Arun Menon906de572013-06-18 17:01:40 -0700304 if (0 == n) {
305 break;
306 }
307
308 if (1 == n) {
309 omx->process_event_cb(omx, id);
310 }
311 if ((n < 0) && (errno != EINTR)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700312 DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
Arun Menon906de572013-06-18 17:01:40 -0700313 break;
314 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700315 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700316 DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
Arun Menon906de572013-06-18 17:01:40 -0700317 return 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700318}
319
320void post_message(omx_vdec *omx, unsigned char id)
321{
Arun Menon906de572013-06-18 17:01:40 -0700322 int ret_value;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700323 DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
Arun Menon906de572013-06-18 17:01:40 -0700324 ret_value = write(omx->m_pipe_out, &id, 1);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700325 DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700326}
327
328// omx_cmd_queue destructor
329omx_vdec::omx_cmd_queue::~omx_cmd_queue()
330{
Arun Menon906de572013-06-18 17:01:40 -0700331 // Nothing to do
Shalaj Jain273b3e02012-06-22 19:08:03 -0700332}
333
334// omx cmd queue constructor
335omx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
336{
337 memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
338}
339
340// omx cmd queue insert
341bool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
342{
Arun Menon906de572013-06-18 17:01:40 -0700343 bool ret = true;
344 if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
345 m_q[m_write].id = id;
346 m_q[m_write].param1 = p1;
347 m_q[m_write].param2 = p2;
348 m_write++;
349 m_size ++;
350 if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
351 m_write = 0;
352 }
353 } else {
354 ret = false;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700355 DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700356 }
Arun Menon906de572013-06-18 17:01:40 -0700357 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700358}
359
360// omx cmd queue pop
361bool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
362{
Arun Menon906de572013-06-18 17:01:40 -0700363 bool ret = true;
364 if (m_size > 0) {
365 *id = m_q[m_read].id;
366 *p1 = m_q[m_read].param1;
367 *p2 = m_q[m_read].param2;
368 // Move the read pointer ahead
369 ++m_read;
370 --m_size;
371 if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
372 m_read = 0;
373 }
374 } else {
375 ret = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700376 }
Arun Menon906de572013-06-18 17:01:40 -0700377 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700378}
379
380// Retrieve the first mesg type in the queue
381unsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
382{
383 return m_q[m_read].id;
384}
385
386#ifdef _ANDROID_
387omx_vdec::ts_arr_list::ts_arr_list()
388{
Arun Menon906de572013-06-18 17:01:40 -0700389 //initialize timestamps array
390 memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700391}
392omx_vdec::ts_arr_list::~ts_arr_list()
393{
Arun Menon906de572013-06-18 17:01:40 -0700394 //free m_ts_arr_list?
Shalaj Jain273b3e02012-06-22 19:08:03 -0700395}
396
397bool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
398{
Arun Menon906de572013-06-18 17:01:40 -0700399 bool ret = true;
400 bool duplicate_ts = false;
401 int idx = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700402
Arun Menon906de572013-06-18 17:01:40 -0700403 //insert at the first available empty location
404 for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
405 if (!m_ts_arr_list[idx].valid) {
406 //found invalid or empty entry, save timestamp
407 m_ts_arr_list[idx].valid = true;
408 m_ts_arr_list[idx].timestamp = ts;
409 DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
410 ts, idx);
411 break;
412 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700413 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700414
Arun Menon906de572013-06-18 17:01:40 -0700415 if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
416 DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
417 ret = false;
418 }
419 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700420}
421
422bool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
423{
Arun Menon906de572013-06-18 17:01:40 -0700424 bool ret = true;
425 int min_idx = -1;
426 OMX_TICKS min_ts = 0;
427 int idx = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700428
Arun Menon906de572013-06-18 17:01:40 -0700429 for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
Shalaj Jain273b3e02012-06-22 19:08:03 -0700430
Arun Menon906de572013-06-18 17:01:40 -0700431 if (m_ts_arr_list[idx].valid) {
432 //found valid entry, save index
433 if (min_idx < 0) {
434 //first valid entry
435 min_ts = m_ts_arr_list[idx].timestamp;
436 min_idx = idx;
437 } else if (m_ts_arr_list[idx].timestamp < min_ts) {
438 min_ts = m_ts_arr_list[idx].timestamp;
439 min_idx = idx;
440 }
441 }
442
Shalaj Jain273b3e02012-06-22 19:08:03 -0700443 }
444
Arun Menon906de572013-06-18 17:01:40 -0700445 if (min_idx < 0) {
446 //no valid entries found
447 DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
448 ts = 0;
449 ret = false;
450 } else {
451 ts = m_ts_arr_list[min_idx].timestamp;
452 m_ts_arr_list[min_idx].valid = false;
453 DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
454 ts, min_idx);
455 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700456
Arun Menon906de572013-06-18 17:01:40 -0700457 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700458
459}
460
461
462bool omx_vdec::ts_arr_list::reset_ts_list()
463{
Arun Menon906de572013-06-18 17:01:40 -0700464 bool ret = true;
465 int idx = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700466
Arun Menon906de572013-06-18 17:01:40 -0700467 DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
468 for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
469 m_ts_arr_list[idx].valid = false;
470 }
471 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700472}
473#endif
474
475// factory function executed by the core to create instances
476void *get_omx_component_factory_fn(void)
477{
Arun Menon906de572013-06-18 17:01:40 -0700478 return (new omx_vdec);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700479}
480
481#ifdef _ANDROID_
482#ifdef USE_ION
483VideoHeap::VideoHeap(int devicefd, size_t size, void* base,
Arun Menon906de572013-06-18 17:01:40 -0700484 struct ion_handle *handle, int ionMapfd)
Shalaj Jain273b3e02012-06-22 19:08:03 -0700485{
Arun Menon906de572013-06-18 17:01:40 -0700486 // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700487}
488#else
489VideoHeap::VideoHeap(int fd, size_t size, void* base)
490{
491 // dup file descriptor, map once, use pmem
492 init(dup(fd), base, size, 0 , MEM_DEVICE);
493}
494#endif
495#endif // _ANDROID_
496/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -0700497 FUNCTION
498 omx_vdec::omx_vdec
Shalaj Jain273b3e02012-06-22 19:08:03 -0700499
Arun Menon906de572013-06-18 17:01:40 -0700500 DESCRIPTION
501 Constructor
Shalaj Jain273b3e02012-06-22 19:08:03 -0700502
Arun Menon906de572013-06-18 17:01:40 -0700503 PARAMETERS
504 None
Shalaj Jain273b3e02012-06-22 19:08:03 -0700505
Arun Menon906de572013-06-18 17:01:40 -0700506 RETURN VALUE
507 None.
508 ========================================================================== */
Deva Ramasubramanian5c241242013-02-19 17:25:30 -0800509omx_vdec::omx_vdec(): m_error_propogated(false),
Arun Menon906de572013-06-18 17:01:40 -0700510 m_state(OMX_StateInvalid),
511 m_app_data(NULL),
512 m_inp_mem_ptr(NULL),
513 m_out_mem_ptr(NULL),
Arun Menon906de572013-06-18 17:01:40 -0700514 input_flush_progress (false),
515 output_flush_progress (false),
516 input_use_buffer (false),
517 output_use_buffer (false),
518 ouput_egl_buffers(false),
519 m_use_output_pmem(OMX_FALSE),
520 m_out_mem_region_smi(OMX_FALSE),
521 m_out_pvt_entry_pmem(OMX_FALSE),
522 pending_input_buffers(0),
523 pending_output_buffers(0),
524 m_out_bm_count(0),
525 m_inp_bm_count(0),
526 m_inp_bPopulated(OMX_FALSE),
527 m_out_bPopulated(OMX_FALSE),
528 m_flags(0),
Shalaj Jain273b3e02012-06-22 19:08:03 -0700529#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700530 m_heap_ptr(NULL),
Shalaj Jain273b3e02012-06-22 19:08:03 -0700531#endif
Arun Menon906de572013-06-18 17:01:40 -0700532 m_inp_bEnabled(OMX_TRUE),
533 m_out_bEnabled(OMX_TRUE),
534 m_in_alloc_cnt(0),
535 m_platform_list(NULL),
536 m_platform_entry(NULL),
537 m_pmem_info(NULL),
538 arbitrary_bytes (true),
539 psource_frame (NULL),
540 pdest_frame (NULL),
541 m_inp_heap_ptr (NULL),
542 m_phdr_pmem_ptr(NULL),
543 m_heap_inp_bm_count (0),
544 codec_type_parse ((codec_type)0),
545 first_frame_meta (true),
546 frame_count (0),
547 nal_count (0),
548 nal_length(0),
549 look_ahead_nal (false),
550 first_frame(0),
551 first_buffer(NULL),
552 first_frame_size (0),
553 m_device_file_ptr(NULL),
554 m_vc1_profile((vc1_profile_type)0),
Arun Menon906de572013-06-18 17:01:40 -0700555 h264_last_au_ts(LLONG_MAX),
556 h264_last_au_flags(0),
Surajit Podderd2644d52013-08-28 17:59:06 +0530557 m_disp_hor_size(0),
558 m_disp_vert_size(0),
Arun Menon906de572013-06-18 17:01:40 -0700559 prev_ts(LLONG_MAX),
560 rst_prev_ts(true),
561 frm_int(0),
Arun Menon906de572013-06-18 17:01:40 -0700562 in_reconfig(false),
563 m_display_id(NULL),
564 h264_parser(NULL),
565 client_extradata(0),
566 m_reject_avc_1080p_mp (0),
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +0530567 m_other_extradata(NULL),
Shalaj Jain273b3e02012-06-22 19:08:03 -0700568#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700569 m_enable_android_native_buffers(OMX_FALSE),
570 m_use_android_native_buffers(OMX_FALSE),
571 iDivXDrmDecrypt(NULL),
Shalaj Jain273b3e02012-06-22 19:08:03 -0700572#endif
Arun Menon906de572013-06-18 17:01:40 -0700573 m_desc_buffer_ptr(NULL),
574 secure_mode(false),
Surajit Podderd2644d52013-08-28 17:59:06 +0530575 m_profile(0),
vivek mehtaa75c69f2014-01-10 21:50:37 -0800576 client_set_fps(false),
Deva Ramasubramanian1fd93812014-03-26 15:17:15 -0700577 m_last_rendered_TS(-1),
578 m_queued_codec_config_count(0)
Shalaj Jain273b3e02012-06-22 19:08:03 -0700579{
Arun Menon906de572013-06-18 17:01:40 -0700580 /* Assumption is that , to begin with , we have all the frames with decoder */
581 DEBUG_PRINT_HIGH("In OMX vdec Constructor");
Jayasena Sangaraboina51230642013-08-21 18:02:13 -0700582 memset(&m_debug,0,sizeof(m_debug));
Shalaj Jain273b3e02012-06-22 19:08:03 -0700583#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700584 char property_value[PROPERTY_VALUE_MAX] = {0};
Jayasena Sangaraboinac4dfc282013-08-08 12:41:39 -0700585 property_get("vidc.debug.level", property_value, "0");
586 debug_level = atoi(property_value);
587 property_value[0] = '\0';
588
Jayasena Sangaraboina51230642013-08-21 18:02:13 -0700589 DEBUG_PRINT_HIGH("In OMX vdec Constructor");
590
Arun Menon906de572013-06-18 17:01:40 -0700591 property_get("vidc.dec.debug.perf", property_value, "0");
592 perf_flag = atoi(property_value);
593 if (perf_flag) {
594 DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
595 dec_time.start();
596 proc_frms = latency = 0;
597 }
598 prev_n_filled_len = 0;
599 property_value[0] = '\0';
600 property_get("vidc.dec.debug.ts", property_value, "0");
601 m_debug_timestamp = atoi(property_value);
602 DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
603 if (m_debug_timestamp) {
604 time_stamp_dts.set_timestamp_reorder_mode(true);
605 time_stamp_dts.enable_debug_print(true);
606 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700607
Arun Menon906de572013-06-18 17:01:40 -0700608 property_value[0] = '\0';
609 property_get("vidc.dec.debug.concealedmb", property_value, "0");
610 m_debug_concealedmb = atoi(property_value);
611 DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700612
Arun Menon906de572013-06-18 17:01:40 -0700613 property_value[0] = '\0';
614 property_get("vidc.dec.profile.check", property_value, "0");
615 m_reject_avc_1080p_mp = atoi(property_value);
616 DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
Rajeshwar Kurapatye0e7d0c2013-07-30 19:46:26 +0530617
Jayasena Sangaraboina51230642013-08-21 18:02:13 -0700618 property_value[0] = '\0';
619 property_get("vidc.dec.log.in", property_value, "0");
620 m_debug.in_buffer_log = atoi(property_value);
621
622 property_value[0] = '\0';
623 property_get("vidc.dec.log.out", property_value, "0");
624 m_debug.out_buffer_log = atoi(property_value);
625 sprintf(m_debug.log_loc, "%s", BUFFER_LOG_LOC);
626
627 property_value[0] = '\0';
628 property_get("vidc.log.loc", property_value, "");
629 if (*property_value)
630 strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX);
vivek mehta79cff222014-01-22 12:17:07 -0800631
632 property_value[0] = '\0';
633 property_get("vidc.dec.120fps.enabled", property_value, "0");
634
635 //if this feature is not enabled then reset this value -ve
636 if(atoi(property_value)) {
637 DEBUG_PRINT_LOW("feature 120 FPS decode enabled");
638 m_last_rendered_TS = 0;
639 }
640
Shalaj Jain273b3e02012-06-22 19:08:03 -0700641#endif
Arun Menon906de572013-06-18 17:01:40 -0700642 memset(&m_cmp,0,sizeof(m_cmp));
643 memset(&m_cb,0,sizeof(m_cb));
644 memset (&drv_ctx,0,sizeof(drv_ctx));
645 memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
646 memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
647 memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
Pushkaraj Patil8d273cb2014-07-21 10:43:22 +0530648 memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize));
Arun Menon906de572013-06-18 17:01:40 -0700649 m_demux_entries = 0;
650 msg_thread_id = 0;
651 async_thread_id = 0;
652 msg_thread_created = false;
653 async_thread_created = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700654#ifdef _ANDROID_ICS_
Arun Menon906de572013-06-18 17:01:40 -0700655 memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
Shalaj Jain273b3e02012-06-22 19:08:03 -0700656#endif
Arun Menon906de572013-06-18 17:01:40 -0700657 memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
Maheshwar Ajjad2df2182013-10-24 19:20:34 +0530658 memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
Arun Menon906de572013-06-18 17:01:40 -0700659 drv_ctx.timestamp_adjust = false;
660 drv_ctx.video_driver_fd = -1;
661 m_vendor_config.pData = NULL;
662 pthread_mutex_init(&m_lock, NULL);
663 pthread_mutex_init(&c_lock, NULL);
664 sem_init(&m_cmd_lock,0,0);
Deva Ramasubramanian1fd93812014-03-26 15:17:15 -0700665 sem_init(&m_safe_flush, 0, 0);
Arun Menon906de572013-06-18 17:01:40 -0700666 streaming[CAPTURE_PORT] =
667 streaming[OUTPUT_PORT] = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700668#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700669 char extradata_value[PROPERTY_VALUE_MAX] = {0};
670 property_get("vidc.dec.debug.extradata", extradata_value, "0");
671 m_debug_extradata = atoi(extradata_value);
672 DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700673#endif
Arun Menon906de572013-06-18 17:01:40 -0700674 m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
675 client_buffers.set_vdec_client(this);
Arun Menonbdb80b02013-08-12 17:45:54 -0700676 dynamic_buf_mode = false;
677 out_dynamic_list = NULL;
Praveen Chavane78460c2013-12-06 23:16:04 -0800678 is_down_scalar_enabled = false;
Praveen Chavancf924182013-12-06 23:16:23 -0800679 m_smoothstreaming_mode = false;
680 m_smoothstreaming_width = 0;
681 m_smoothstreaming_height = 0;
Deepak Vermaa2efdb12013-12-26 12:30:05 +0530682 is_q6_platform = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700683}
684
Vinay Kalia85793762012-06-14 19:12:34 -0700685static const int event_type[] = {
Arun Menon906de572013-06-18 17:01:40 -0700686 V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
687 V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
688 V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
Arun Menonbdb80b02013-08-12 17:45:54 -0700689 V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE,
690 V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER,
Arun Menon906de572013-06-18 17:01:40 -0700691 V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
Jia Meng1e236c82014-04-03 10:54:39 +0800692 V4L2_EVENT_MSM_VIDC_SYS_ERROR,
693 V4L2_EVENT_MSM_VIDC_HW_OVERLOAD
Vinay Kalia85793762012-06-14 19:12:34 -0700694};
695
696static OMX_ERRORTYPE subscribe_to_events(int fd)
697{
Arun Menon906de572013-06-18 17:01:40 -0700698 OMX_ERRORTYPE eRet = OMX_ErrorNone;
699 struct v4l2_event_subscription sub;
700 int array_sz = sizeof(event_type)/sizeof(int);
701 int i,rc;
702 if (fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700703 DEBUG_PRINT_ERROR("Invalid input: %d", fd);
Arun Menon906de572013-06-18 17:01:40 -0700704 return OMX_ErrorBadParameter;
705 }
Vinay Kalia85793762012-06-14 19:12:34 -0700706
Arun Menon906de572013-06-18 17:01:40 -0700707 for (i = 0; i < array_sz; ++i) {
708 memset(&sub, 0, sizeof(sub));
709 sub.type = event_type[i];
710 rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
711 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700712 DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
Arun Menon906de572013-06-18 17:01:40 -0700713 break;
714 }
715 }
716 if (i < array_sz) {
717 for (--i; i >=0 ; i--) {
718 memset(&sub, 0, sizeof(sub));
719 sub.type = event_type[i];
720 rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
721 if (rc)
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700722 DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
Arun Menon906de572013-06-18 17:01:40 -0700723 }
724 eRet = OMX_ErrorNotImplemented;
725 }
726 return eRet;
Vinay Kalia85793762012-06-14 19:12:34 -0700727}
728
729
730static OMX_ERRORTYPE unsubscribe_to_events(int fd)
731{
Arun Menon906de572013-06-18 17:01:40 -0700732 OMX_ERRORTYPE eRet = OMX_ErrorNone;
733 struct v4l2_event_subscription sub;
734 int array_sz = sizeof(event_type)/sizeof(int);
735 int i,rc;
736 if (fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700737 DEBUG_PRINT_ERROR("Invalid input: %d", fd);
Arun Menon906de572013-06-18 17:01:40 -0700738 return OMX_ErrorBadParameter;
739 }
Vinay Kalia85793762012-06-14 19:12:34 -0700740
Arun Menon906de572013-06-18 17:01:40 -0700741 for (i = 0; i < array_sz; ++i) {
742 memset(&sub, 0, sizeof(sub));
743 sub.type = event_type[i];
744 rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
745 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700746 DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
Arun Menon906de572013-06-18 17:01:40 -0700747 break;
748 }
749 }
750 return eRet;
Vinay Kalia85793762012-06-14 19:12:34 -0700751}
Shalaj Jain273b3e02012-06-22 19:08:03 -0700752
753/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -0700754 FUNCTION
755 omx_vdec::~omx_vdec
Shalaj Jain273b3e02012-06-22 19:08:03 -0700756
Arun Menon906de572013-06-18 17:01:40 -0700757 DESCRIPTION
758 Destructor
Shalaj Jain273b3e02012-06-22 19:08:03 -0700759
Arun Menon906de572013-06-18 17:01:40 -0700760 PARAMETERS
761 None
Shalaj Jain273b3e02012-06-22 19:08:03 -0700762
Arun Menon906de572013-06-18 17:01:40 -0700763 RETURN VALUE
764 None.
765 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -0700766omx_vdec::~omx_vdec()
767{
Arun Menon906de572013-06-18 17:01:40 -0700768 m_pmem_info = NULL;
769 struct v4l2_decoder_cmd dec;
770 DEBUG_PRINT_HIGH("In OMX vdec Destructor");
771 if (m_pipe_in) close(m_pipe_in);
772 if (m_pipe_out) close(m_pipe_out);
773 m_pipe_in = -1;
774 m_pipe_out = -1;
775 DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
776 if (msg_thread_created)
777 pthread_join(msg_thread_id,NULL);
778 DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
779 dec.cmd = V4L2_DEC_CMD_STOP;
780 if (drv_ctx.video_driver_fd >=0 ) {
781 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700782 DEBUG_PRINT_ERROR("STOP Command failed");
Arun Menon906de572013-06-18 17:01:40 -0700783 }
784 if (async_thread_created)
785 pthread_join(async_thread_id,NULL);
786 unsubscribe_to_events(drv_ctx.video_driver_fd);
787 close(drv_ctx.video_driver_fd);
788 pthread_mutex_destroy(&m_lock);
789 pthread_mutex_destroy(&c_lock);
790 sem_destroy(&m_cmd_lock);
791 if (perf_flag) {
792 DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
793 dec_time.end();
794 }
795 DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
Shalaj Jain273b3e02012-06-22 19:08:03 -0700796}
797
Arun Menon906de572013-06-18 17:01:40 -0700798int release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
799{
800 struct v4l2_requestbuffers bufreq;
801 int rc = 0;
802 if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
803 bufreq.memory = V4L2_MEMORY_USERPTR;
804 bufreq.count = 0;
805 bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
806 rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
Surajit Podder12aefac2013-08-06 18:43:32 +0530807 } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) {
808 bufreq.memory = V4L2_MEMORY_USERPTR;
809 bufreq.count = 0;
810 bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
811 rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
Arun Menon906de572013-06-18 17:01:40 -0700812 }
813 return rc;
Vinay Kaliafeef7032012-09-25 19:23:33 -0700814}
815
Shalaj Jain273b3e02012-06-22 19:08:03 -0700816/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -0700817 FUNCTION
818 omx_vdec::OMXCntrlProcessMsgCb
Shalaj Jain273b3e02012-06-22 19:08:03 -0700819
Arun Menon906de572013-06-18 17:01:40 -0700820 DESCRIPTION
821 IL Client callbacks are generated through this routine. The decoder
822 provides the thread context for this routine.
Shalaj Jain273b3e02012-06-22 19:08:03 -0700823
Arun Menon906de572013-06-18 17:01:40 -0700824 PARAMETERS
825 ctxt -- Context information related to the self.
826 id -- Event identifier. This could be any of the following:
827 1. Command completion event
828 2. Buffer done callback event
829 3. Frame done callback event
Shalaj Jain273b3e02012-06-22 19:08:03 -0700830
Arun Menon906de572013-06-18 17:01:40 -0700831 RETURN VALUE
832 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -0700833
Arun Menon906de572013-06-18 17:01:40 -0700834 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -0700835void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
836{
Arun Menon906de572013-06-18 17:01:40 -0700837 signed p1; // Parameter - 1
838 signed p2; // Parameter - 2
839 unsigned ident;
840 unsigned qsize=0; // qsize
841 omx_vdec *pThis = (omx_vdec *) ctxt;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700842
Arun Menon906de572013-06-18 17:01:40 -0700843 if (!pThis) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700844 DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
Arun Menon906de572013-06-18 17:01:40 -0700845 __func__);
846 return;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700847 }
848
Arun Menon906de572013-06-18 17:01:40 -0700849 // Protect the shared queue data structure
850 do {
851 /*Read the message id's from the queue*/
852 pthread_mutex_lock(&pThis->m_lock);
853 qsize = pThis->m_cmd_q.m_size;
854 if (qsize) {
855 pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700856 }
Arun Menon906de572013-06-18 17:01:40 -0700857
858 if (qsize == 0 && pThis->m_state != OMX_StatePause) {
859 qsize = pThis->m_ftb_q.m_size;
860 if (qsize) {
861 pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
862 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700863 }
Arun Menon906de572013-06-18 17:01:40 -0700864
865 if (qsize == 0 && pThis->m_state != OMX_StatePause) {
866 qsize = pThis->m_etb_q.m_size;
867 if (qsize) {
868 pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
869 }
870 }
871 pthread_mutex_unlock(&pThis->m_lock);
872
873 /*process message if we have one*/
874 if (qsize > 0) {
875 id = ident;
876 switch (id) {
877 case OMX_COMPONENT_GENERATE_EVENT:
878 if (pThis->m_cb.EventHandler) {
879 switch (p1) {
880 case OMX_CommandStateSet:
881 pThis->m_state = (OMX_STATETYPE) p2;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700882 DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
Arun Menon906de572013-06-18 17:01:40 -0700883 pThis->m_state);
884 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
885 OMX_EventCmdComplete, p1, p2, NULL);
886 break;
887
888 case OMX_EventError:
889 if (p2 == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700890 DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
Arun Menon906de572013-06-18 17:01:40 -0700891 pThis->m_state = (OMX_STATETYPE) p2;
892 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
893 OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
894 } else if (p2 == OMX_ErrorHardware) {
895 pThis->omx_report_error();
896 } else {
897 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
898 OMX_EventError, p2, (OMX_U32)NULL, NULL );
899 }
900 break;
901
902 case OMX_CommandPortDisable:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700903 DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2);
Arun Menon906de572013-06-18 17:01:40 -0700904 if (BITMASK_PRESENT(&pThis->m_flags,
905 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
906 BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
907 break;
908 }
909 if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) {
910 OMX_ERRORTYPE eRet = OMX_ErrorNone;
911 pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
912 if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700913 DEBUG_PRINT_HIGH("Failed to release output buffers");
Arun Menon906de572013-06-18 17:01:40 -0700914 OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
915 pThis->in_reconfig = false;
916 if (eRet != OMX_ErrorNone) {
917 DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
918 pThis->omx_report_error();
919 break;
920 }
921 }
922 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
923 OMX_EventCmdComplete, p1, p2, NULL );
924 break;
925 case OMX_CommandPortEnable:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700926 DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2);
Arun Menon906de572013-06-18 17:01:40 -0700927 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
928 OMX_EventCmdComplete, p1, p2, NULL );
929 break;
930
931 default:
932 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
933 OMX_EventCmdComplete, p1, p2, NULL );
934 break;
935
936 }
937 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700938 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
Arun Menon906de572013-06-18 17:01:40 -0700939 }
940 break;
941 case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
942 if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
943 (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700944 DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
Arun Menon906de572013-06-18 17:01:40 -0700945 pThis->omx_report_error ();
946 }
947 break;
Jia Meng1e236c82014-04-03 10:54:39 +0800948 case OMX_COMPONENT_GENERATE_ETB: {
949 OMX_ERRORTYPE iret;
950 iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2);
951 if (iret == OMX_ErrorInsufficientResources) {
952 DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload");
953 pThis->omx_report_hw_overload ();
954 } else if (iret != OMX_ErrorNone) {
955 DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
956 pThis->omx_report_error ();
957 }
Arun Menon906de572013-06-18 17:01:40 -0700958 }
959 break;
960
961 case OMX_COMPONENT_GENERATE_FTB:
962 if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
963 (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700964 DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
Arun Menon906de572013-06-18 17:01:40 -0700965 pThis->omx_report_error ();
966 }
967 break;
968
969 case OMX_COMPONENT_GENERATE_COMMAND:
970 pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
971 (OMX_U32)p2,(OMX_PTR)NULL);
972 break;
973
974 case OMX_COMPONENT_GENERATE_EBD:
975
976 if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700977 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
Arun Menon906de572013-06-18 17:01:40 -0700978 pThis->omx_report_error ();
979 } else {
980 if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
Arun Menon906de572013-06-18 17:01:40 -0700981 pThis->time_stamp_dts.remove_time_stamp(
982 ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
983 (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
984 ?true:false);
Arun Menon906de572013-06-18 17:01:40 -0700985 }
Deva Ramasubramanian02b0d882014-04-03 14:58:50 -0700986
Arun Menon906de572013-06-18 17:01:40 -0700987 if ( pThis->empty_buffer_done(&pThis->m_cmp,
988 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -0700989 DEBUG_PRINT_ERROR("empty_buffer_done failure");
Arun Menon906de572013-06-18 17:01:40 -0700990 pThis->omx_report_error ();
991 }
Arun Menon906de572013-06-18 17:01:40 -0700992 }
993 break;
994 case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: {
995 int64_t *timestamp = (int64_t *)p1;
996 if (p1) {
997 pThis->time_stamp_dts.remove_time_stamp(*timestamp,
998 (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
999 ?true:false);
1000 free(timestamp);
1001 }
1002 }
1003 break;
1004 case OMX_COMPONENT_GENERATE_FBD:
1005 if (p2 != VDEC_S_SUCCESS) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001006 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
Arun Menon906de572013-06-18 17:01:40 -07001007 pThis->omx_report_error ();
1008 } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
1009 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001010 DEBUG_PRINT_ERROR("fill_buffer_done failure");
Arun Menon906de572013-06-18 17:01:40 -07001011 pThis->omx_report_error ();
1012 }
1013 break;
1014
1015 case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001016 DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
Arun Menon906de572013-06-18 17:01:40 -07001017 if (!pThis->input_flush_progress) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001018 DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
Arun Menon906de572013-06-18 17:01:40 -07001019 } else {
1020 pThis->execute_input_flush();
1021 if (pThis->m_cb.EventHandler) {
1022 if (p2 != VDEC_S_SUCCESS) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001023 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
Arun Menon906de572013-06-18 17:01:40 -07001024 pThis->omx_report_error ();
1025 } else {
1026 /*Check if we need generate event for Flush done*/
1027 if (BITMASK_PRESENT(&pThis->m_flags,
1028 OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
1029 BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001030 DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
Arun Menon906de572013-06-18 17:01:40 -07001031 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1032 OMX_EventCmdComplete,OMX_CommandFlush,
1033 OMX_CORE_INPUT_PORT_INDEX,NULL );
1034 }
1035 if (BITMASK_PRESENT(&pThis->m_flags,
1036 OMX_COMPONENT_IDLE_PENDING)) {
1037 if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001038 DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
Arun Menon906de572013-06-18 17:01:40 -07001039 pThis->omx_report_error ();
1040 } else {
1041 pThis->streaming[OUTPUT_PORT] = false;
1042 }
1043 if (!pThis->output_flush_progress) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001044 DEBUG_PRINT_LOW("Input flush done hence issue stop");
Arun Menon906de572013-06-18 17:01:40 -07001045 pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
1046 OMX_COMPONENT_GENERATE_STOP_DONE);
1047 }
1048 }
1049 }
1050 } else {
1051 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1052 }
1053 }
1054 break;
1055
1056 case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001057 DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
Arun Menon906de572013-06-18 17:01:40 -07001058 if (!pThis->output_flush_progress) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001059 DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
Arun Menon906de572013-06-18 17:01:40 -07001060 } else {
1061 pThis->execute_output_flush();
1062 if (pThis->m_cb.EventHandler) {
1063 if (p2 != VDEC_S_SUCCESS) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001064 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
Arun Menon906de572013-06-18 17:01:40 -07001065 pThis->omx_report_error ();
1066 } else {
1067 /*Check if we need generate event for Flush done*/
1068 if (BITMASK_PRESENT(&pThis->m_flags,
1069 OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001070 DEBUG_PRINT_LOW("Notify Output Flush done");
Arun Menon906de572013-06-18 17:01:40 -07001071 BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
1072 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1073 OMX_EventCmdComplete,OMX_CommandFlush,
1074 OMX_CORE_OUTPUT_PORT_INDEX,NULL );
1075 }
1076 if (BITMASK_PRESENT(&pThis->m_flags,
1077 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001078 DEBUG_PRINT_LOW("Internal flush complete");
Arun Menon906de572013-06-18 17:01:40 -07001079 BITMASK_CLEAR (&pThis->m_flags,
1080 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
1081 if (BITMASK_PRESENT(&pThis->m_flags,
1082 OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
1083 pThis->post_event(OMX_CommandPortDisable,
1084 OMX_CORE_OUTPUT_PORT_INDEX,
1085 OMX_COMPONENT_GENERATE_EVENT);
1086 BITMASK_CLEAR (&pThis->m_flags,
1087 OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
Praneeth Paladugub52072a2013-08-23 13:54:43 -07001088 BITMASK_CLEAR (&pThis->m_flags,
1089 OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
Arun Menon906de572013-06-18 17:01:40 -07001090
1091 }
1092 }
1093
1094 if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
1095 if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001096 DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
Arun Menon906de572013-06-18 17:01:40 -07001097 pThis->omx_report_error ();
1098 break;
1099 }
1100 pThis->streaming[CAPTURE_PORT] = false;
1101 if (!pThis->input_flush_progress) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001102 DEBUG_PRINT_LOW("Output flush done hence issue stop");
Arun Menon906de572013-06-18 17:01:40 -07001103 pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
1104 OMX_COMPONENT_GENERATE_STOP_DONE);
1105 }
1106 }
1107 }
1108 } else {
1109 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1110 }
1111 }
1112 break;
1113
1114 case OMX_COMPONENT_GENERATE_START_DONE:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001115 DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
Arun Menon906de572013-06-18 17:01:40 -07001116
1117 if (pThis->m_cb.EventHandler) {
1118 if (p2 != VDEC_S_SUCCESS) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001119 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
Arun Menon906de572013-06-18 17:01:40 -07001120 pThis->omx_report_error ();
1121 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001122 DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
Arun Menon906de572013-06-18 17:01:40 -07001123 if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001124 DEBUG_PRINT_LOW("Move to executing");
Arun Menon906de572013-06-18 17:01:40 -07001125 // Send the callback now
1126 BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
1127 pThis->m_state = OMX_StateExecuting;
1128 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1129 OMX_EventCmdComplete,OMX_CommandStateSet,
1130 OMX_StateExecuting, NULL);
1131 } else if (BITMASK_PRESENT(&pThis->m_flags,
1132 OMX_COMPONENT_PAUSE_PENDING)) {
1133 if (/*ioctl (pThis->drv_ctx.video_driver_fd,
1134 VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001135 DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
Arun Menon906de572013-06-18 17:01:40 -07001136 pThis->omx_report_error ();
1137 }
1138 }
1139 }
1140 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001141 DEBUG_PRINT_LOW("Event Handler callback is NULL");
Arun Menon906de572013-06-18 17:01:40 -07001142 }
1143 break;
1144
1145 case OMX_COMPONENT_GENERATE_PAUSE_DONE:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001146 DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
Arun Menon906de572013-06-18 17:01:40 -07001147 if (pThis->m_cb.EventHandler) {
1148 if (p2 != VDEC_S_SUCCESS) {
1149 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
1150 pThis->omx_report_error ();
1151 } else {
1152 pThis->complete_pending_buffer_done_cbs();
1153 if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001154 DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
Arun Menon906de572013-06-18 17:01:40 -07001155 //Send the callback now
1156 BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
1157 pThis->m_state = OMX_StatePause;
1158 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1159 OMX_EventCmdComplete,OMX_CommandStateSet,
1160 OMX_StatePause, NULL);
1161 }
1162 }
1163 } else {
1164 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1165 }
1166
1167 break;
1168
1169 case OMX_COMPONENT_GENERATE_RESUME_DONE:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001170 DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
Arun Menon906de572013-06-18 17:01:40 -07001171 if (pThis->m_cb.EventHandler) {
1172 if (p2 != VDEC_S_SUCCESS) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001173 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
Arun Menon906de572013-06-18 17:01:40 -07001174 pThis->omx_report_error ();
1175 } else {
1176 if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001177 DEBUG_PRINT_LOW("Moving the decoder to execute state");
Arun Menon906de572013-06-18 17:01:40 -07001178 // Send the callback now
1179 BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
1180 pThis->m_state = OMX_StateExecuting;
1181 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1182 OMX_EventCmdComplete,OMX_CommandStateSet,
1183 OMX_StateExecuting,NULL);
1184 }
1185 }
1186 } else {
1187 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1188 }
1189
1190 break;
1191
1192 case OMX_COMPONENT_GENERATE_STOP_DONE:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001193 DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
Arun Menon906de572013-06-18 17:01:40 -07001194 if (pThis->m_cb.EventHandler) {
1195 if (p2 != VDEC_S_SUCCESS) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001196 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
Arun Menon906de572013-06-18 17:01:40 -07001197 pThis->omx_report_error ();
1198 } else {
1199 pThis->complete_pending_buffer_done_cbs();
1200 if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001201 DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
Arun Menon906de572013-06-18 17:01:40 -07001202 // Send the callback now
1203 BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
1204 pThis->m_state = OMX_StateIdle;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001205 DEBUG_PRINT_LOW("Move to Idle State");
Arun Menon906de572013-06-18 17:01:40 -07001206 pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
1207 OMX_EventCmdComplete,OMX_CommandStateSet,
1208 OMX_StateIdle,NULL);
1209 }
1210 }
1211 } else {
1212 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1213 }
1214
1215 break;
1216
1217 case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
Arun Menon906de572013-06-18 17:01:40 -07001218 if (p2 == OMX_IndexParamPortDefinition) {
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05301219 DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition");
Arun Menon906de572013-06-18 17:01:40 -07001220 pThis->in_reconfig = true;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05301221
1222 } else if (p2 == OMX_IndexConfigCommonOutputCrop) {
1223 DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop");
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05301224
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +05301225 /* Check if resolution is changed in smooth streaming mode */
1226 if (pThis->m_smoothstreaming_mode &&
1227 (pThis->framesize.nWidth !=
1228 pThis->drv_ctx.video_resolution.frame_width) ||
1229 (pThis->framesize.nHeight !=
1230 pThis->drv_ctx.video_resolution.frame_height)) {
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05301231
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +05301232 DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d",
1233 pThis->framesize.nWidth,
1234 pThis->framesize.nHeight,
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05301235 pThis->drv_ctx.video_resolution.frame_width,
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +05301236 pThis->drv_ctx.video_resolution.frame_height);
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05301237
1238 /* Update new resolution */
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +05301239 pThis->framesize.nWidth =
1240 pThis->drv_ctx.video_resolution.frame_width;
1241 pThis->framesize.nHeight =
1242 pThis->drv_ctx.video_resolution.frame_height;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05301243
1244 /* Update C2D with new resolution */
1245 if (!pThis->client_buffers.update_buffer_req()) {
1246 DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed");
1247 }
1248 }
1249
1250 /* Update new crop information */
1251 pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left;
1252 pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top;
1253 pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right;
1254 pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom;
1255
1256 /* Validate the new crop information */
1257 if (pThis->rectangle.nLeft + pThis->rectangle.nWidth >
1258 pThis->drv_ctx.video_resolution.frame_width) {
1259
1260 DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]",
1261 pThis->rectangle.nLeft, pThis->rectangle.nWidth,
1262 pThis->drv_ctx.video_resolution.frame_width);
1263 pThis->rectangle.nLeft = 0;
1264
1265 if (pThis->rectangle.nWidth >
1266 pThis->drv_ctx.video_resolution.frame_width) {
1267
1268 DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]",
1269 pThis->rectangle.nWidth,
1270 pThis->drv_ctx.video_resolution.frame_width);
1271 pThis->rectangle.nWidth =
1272 pThis->drv_ctx.video_resolution.frame_width;
1273 }
1274 }
1275 if (pThis->rectangle.nTop + pThis->rectangle.nHeight >
1276 pThis->drv_ctx.video_resolution.frame_height) {
1277
1278 DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]",
1279 pThis->rectangle.nTop, pThis->rectangle.nHeight,
1280 pThis->drv_ctx.video_resolution.frame_height);
1281 pThis->rectangle.nTop = 0;
1282
1283 if (pThis->rectangle.nHeight >
1284 pThis->drv_ctx.video_resolution.frame_height) {
1285
1286 DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]",
1287 pThis->rectangle.nHeight,
1288 pThis->drv_ctx.video_resolution.frame_height);
1289 pThis->rectangle.nHeight =
1290 pThis->drv_ctx.video_resolution.frame_height;
1291 }
1292 }
1293 DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u",
1294 pThis->rectangle.nLeft, pThis->rectangle.nTop,
1295 pThis->rectangle.nWidth, pThis->rectangle.nHeight);
1296 } else {
1297 DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2);
1298 break;
Arun Menon906de572013-06-18 17:01:40 -07001299 }
1300 if (pThis->m_cb.EventHandler) {
1301 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1302 OMX_EventPortSettingsChanged, p1, p2, NULL );
1303 } else {
1304 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1305 }
Arun Menon906de572013-06-18 17:01:40 -07001306 break;
1307
1308 case OMX_COMPONENT_GENERATE_EOS_DONE:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001309 DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
Arun Menon906de572013-06-18 17:01:40 -07001310 if (pThis->m_cb.EventHandler) {
1311 pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
1312 OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
1313 } else {
1314 DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1315 }
1316 pThis->prev_ts = LLONG_MAX;
1317 pThis->rst_prev_ts = true;
1318 break;
1319
1320 case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001321 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
Arun Menon906de572013-06-18 17:01:40 -07001322 pThis->omx_report_error ();
1323 break;
1324
1325 case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001326 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING");
Arun Menon906de572013-06-18 17:01:40 -07001327 pThis->omx_report_unsupported_setting();
1328 break;
1329
Deepak Verma24720fb2014-01-29 16:57:40 +05301330 case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD:
1331 DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD");
1332 pThis->omx_report_hw_overload();
1333 break;
1334
Arun Menon906de572013-06-18 17:01:40 -07001335 default:
1336 break;
1337 }
1338 }
1339 pthread_mutex_lock(&pThis->m_lock);
1340 qsize = pThis->m_cmd_q.m_size;
1341 if (pThis->m_state != OMX_StatePause)
1342 qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
1343 pthread_mutex_unlock(&pThis->m_lock);
1344 } while (qsize>0);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001345
1346}
1347
Vinay Kaliab9e98102013-04-02 19:31:43 -07001348int omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
Vinay Kalia592e4b42012-12-19 15:55:47 -08001349{
Arun Menon906de572013-06-18 17:01:40 -07001350 int format_changed = 0;
Surajit Podderd2644d52013-08-28 17:59:06 +05301351 if ((height != (int)drv_ctx.video_resolution.frame_height) ||
1352 (width != (int)drv_ctx.video_resolution.frame_width)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001353 DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)",
Arun Menon906de572013-06-18 17:01:40 -07001354 width, drv_ctx.video_resolution.frame_width,
1355 height,drv_ctx.video_resolution.frame_height);
1356 format_changed = 1;
1357 }
Vinay Kalia592e4b42012-12-19 15:55:47 -08001358 drv_ctx.video_resolution.frame_height = height;
1359 drv_ctx.video_resolution.frame_width = width;
Vinay Kalia21649b32013-03-18 17:28:07 -07001360 drv_ctx.video_resolution.scan_lines = scan_lines;
1361 drv_ctx.video_resolution.stride = stride;
Pushkaraj Patil41588352014-02-25 20:51:34 +05301362 if(!is_down_scalar_enabled) {
1363 rectangle.nLeft = 0;
1364 rectangle.nTop = 0;
1365 rectangle.nWidth = drv_ctx.video_resolution.frame_width;
1366 rectangle.nHeight = drv_ctx.video_resolution.frame_height;
1367 }
Arun Menon906de572013-06-18 17:01:40 -07001368 return format_changed;
Vinay Kalia592e4b42012-12-19 15:55:47 -08001369}
1370
Arun Menon6836ba02013-02-19 20:37:40 -08001371OMX_ERRORTYPE omx_vdec::is_video_session_supported()
1372{
Arun Menon906de572013-06-18 17:01:40 -07001373 if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
1374 OMX_MAX_STRINGNAME_SIZE) &&
1375 (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
1376 m_decoder_capability.max_width = 1280;
1377 m_decoder_capability.max_height = 720;
1378 DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
1379 }
Arun Menon888aa852013-05-30 11:24:42 -07001380
Arun Menon906de572013-06-18 17:01:40 -07001381 if ((drv_ctx.video_resolution.frame_width *
1382 drv_ctx.video_resolution.frame_height >
1383 m_decoder_capability.max_width *
1384 m_decoder_capability.max_height) ||
1385 (drv_ctx.video_resolution.frame_width*
1386 drv_ctx.video_resolution.frame_height <
1387 m_decoder_capability.min_width *
1388 m_decoder_capability.min_height)) {
1389 DEBUG_PRINT_ERROR(
1390 "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
1391 drv_ctx.video_resolution.frame_width,
1392 drv_ctx.video_resolution.frame_height,
1393 m_decoder_capability.min_width,
1394 m_decoder_capability.min_height,
1395 m_decoder_capability.max_width,
1396 m_decoder_capability.max_height);
1397 return OMX_ErrorUnsupportedSetting;
1398 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001399 DEBUG_PRINT_HIGH("video session supported");
Arun Menon906de572013-06-18 17:01:40 -07001400 return OMX_ErrorNone;
Arun Menon6836ba02013-02-19 20:37:40 -08001401}
1402
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07001403int omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len)
1404{
1405 if (m_debug.in_buffer_log && !m_debug.infile) {
1406 if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
1407 sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.m4v",
1408 m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1409 }
1410 else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
1411 sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); }
1412 else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
1413 sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.263",
1414 m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1415 }
1416 else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
1417 sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.264",
1418 m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1419 }
1420 else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
1421 sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.vc1",
1422 m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1423 }
1424 else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) {
1425 sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.vc1",
1426 m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1427 }
1428 else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
1429 sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.ivf",
1430 m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1431 }
1432 m_debug.infile = fopen (m_debug.infile_name, "ab");
1433 if (!m_debug.infile) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001434 DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name);
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07001435 m_debug.infile_name[0] = '\0';
1436 return -1;
1437 }
1438 if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
1439 struct ivf_file_header {
1440 OMX_U8 signature[4]; //='DKIF';
1441 OMX_U8 version ; //= 0;
1442 OMX_U8 headersize ; //= 32;
1443 OMX_U32 FourCC;
1444 OMX_U8 width;
1445 OMX_U8 height;
1446 OMX_U32 rate;
1447 OMX_U32 scale;
1448 OMX_U32 length;
1449 OMX_U8 unused[4];
1450 } file_header;
1451
1452 memset((void *)&file_header,0,sizeof(file_header));
1453 file_header.signature[0] = 'D';
1454 file_header.signature[1] = 'K';
1455 file_header.signature[2] = 'I';
1456 file_header.signature[3] = 'F';
1457 file_header.version = 0;
1458 file_header.headersize = 32;
1459 file_header.FourCC = 0x30385056;
1460 fwrite((const char *)&file_header,
1461 sizeof(file_header),1,m_debug.infile);
1462 }
1463 }
1464 if (m_debug.infile && buffer_addr && buffer_len) {
1465 if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
1466 struct vp8_ivf_frame_header {
1467 OMX_U32 framesize;
1468 OMX_U32 timestamp_lo;
1469 OMX_U32 timestamp_hi;
1470 } vp8_frame_header;
1471 vp8_frame_header.framesize = buffer_len;
1472 /* Currently FW doesn't use timestamp values */
1473 vp8_frame_header.timestamp_lo = 0;
1474 vp8_frame_header.timestamp_hi = 0;
1475 fwrite((const char *)&vp8_frame_header,
1476 sizeof(vp8_frame_header),1,m_debug.infile);
1477 }
1478 fwrite(buffer_addr, buffer_len, 1, m_debug.infile);
1479 }
1480 return 0;
1481}
1482
1483int omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) {
1484 if (m_debug.out_buffer_log && !m_debug.outfile) {
1485 sprintf(m_debug.outfile_name, "%s/output_%d_%d_%p.yuv",
1486 m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1487 m_debug.outfile = fopen (m_debug.outfile_name, "ab");
1488 if (!m_debug.outfile) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001489 DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc);
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07001490 m_debug.outfile_name[0] = '\0';
1491 return -1;
1492 }
1493 }
1494 if (m_debug.outfile && buffer && buffer->nFilledLen) {
1495 int buf_index = buffer - m_out_mem_ptr;
1496 int stride = drv_ctx.video_resolution.stride;
1497 int scanlines = drv_ctx.video_resolution.scan_lines;
Deepak Vermaa2efdb12013-12-26 12:30:05 +05301498 if (m_smoothstreaming_mode) {
1499 stride = drv_ctx.video_resolution.frame_width;
1500 scanlines = drv_ctx.video_resolution.frame_height;
1501 stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1));
1502 scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1));
1503 }
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07001504 char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
1505 unsigned i;
Deepak Vermaa2efdb12013-12-26 12:30:05 +05301506 DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)",
1507 drv_ctx.video_resolution.frame_width,
1508 drv_ctx.video_resolution.frame_height, stride, scanlines);
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07001509 int bytes_written = 0;
1510 for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
1511 bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
1512 temp += stride;
1513 }
1514 temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
1515 int stride_c = stride;
1516 for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
1517 bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
1518 temp += stride_c;
1519 }
1520 }
1521 return 0;
1522}
1523
Shalaj Jain273b3e02012-06-22 19:08:03 -07001524/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07001525 FUNCTION
1526 omx_vdec::ComponentInit
Shalaj Jain273b3e02012-06-22 19:08:03 -07001527
Arun Menon906de572013-06-18 17:01:40 -07001528 DESCRIPTION
1529 Initialize the component.
Shalaj Jain273b3e02012-06-22 19:08:03 -07001530
Arun Menon906de572013-06-18 17:01:40 -07001531 PARAMETERS
1532 ctxt -- Context information related to the self.
1533 id -- Event identifier. This could be any of the following:
1534 1. Command completion event
1535 2. Buffer done callback event
1536 3. Frame done callback event
Shalaj Jain273b3e02012-06-22 19:08:03 -07001537
Arun Menon906de572013-06-18 17:01:40 -07001538 RETURN VALUE
1539 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07001540
Arun Menon906de572013-06-18 17:01:40 -07001541 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07001542OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1543{
1544
Arun Menon906de572013-06-18 17:01:40 -07001545 OMX_ERRORTYPE eRet = OMX_ErrorNone;
1546 struct v4l2_fmtdesc fdesc;
1547 struct v4l2_format fmt;
1548 struct v4l2_requestbuffers bufreq;
1549 struct v4l2_control control;
1550 struct v4l2_frmsizeenum frmsize;
1551 unsigned int alignment = 0,buffer_size = 0;
1552 int fds[2];
1553 int r,ret=0;
1554 bool codec_ambiguous = false;
1555 OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_dec";
Jia Meng3a3c6492013-12-19 17:16:52 +08001556 char property_value[PROPERTY_VALUE_MAX] = {0};
Sachin Shahc82a18f2013-03-29 14:45:38 -07001557
1558#ifdef _ANDROID_
Praveen Chavane9e56202013-09-19 03:48:16 -07001559 char platform_name[PROPERTY_VALUE_MAX];
Arun Menon906de572013-06-18 17:01:40 -07001560 property_get("ro.board.platform", platform_name, "0");
1561 if (!strncmp(platform_name, "msm8610", 7)) {
1562 device_name = (OMX_STRING)"/dev/video/q6_dec";
Deepak Vermaa2efdb12013-12-26 12:30:05 +05301563 is_q6_platform = true;
1564 maxSmoothStreamingWidth = 1280;
1565 maxSmoothStreamingHeight = 720;
Arun Menon906de572013-06-18 17:01:40 -07001566 }
Sachin Shahc82a18f2013-03-29 14:45:38 -07001567#endif
1568
Arun Menon906de572013-06-18 17:01:40 -07001569 if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)) {
1570 struct v4l2_control control;
1571 secure_mode = true;
1572 arbitrary_bytes = false;
1573 role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05301574 } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",
1575 OMX_MAX_STRINGNAME_SIZE)){
1576 secure_mode = true;
1577 arbitrary_bytes = false;
1578 role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2";
Arun Menon906de572013-06-18 17:01:40 -07001579 }
Vinay Kalia53fa6832012-10-11 17:55:30 -07001580
Arun Menon906de572013-06-18 17:01:40 -07001581 drv_ctx.video_driver_fd = open(device_name, O_RDWR);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001582
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001583 DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open returned fd %d",
Jayasena Sangaraboinac453bd82013-08-01 14:02:52 -07001584 drv_ctx.video_driver_fd);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001585
Arun Menon906de572013-06-18 17:01:40 -07001586 if (drv_ctx.video_driver_fd == 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001587 DEBUG_PRINT_ERROR("omx_vdec_msm8974 :: Got fd as 0 for msm_vidc_dec, Opening again");
Arun Menon906de572013-06-18 17:01:40 -07001588 drv_ctx.video_driver_fd = open(device_name, O_RDWR);
1589 close(0);
1590 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07001591
Arun Menon906de572013-06-18 17:01:40 -07001592 if (drv_ctx.video_driver_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001593 DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
Arun Menon906de572013-06-18 17:01:40 -07001594 return OMX_ErrorInsufficientResources;
1595 }
1596 drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
1597 drv_ctx.frame_rate.fps_denominator = 1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001598
Vinay Kaliadae8ad62013-04-26 20:42:10 -07001599 ret = subscribe_to_events(drv_ctx.video_driver_fd);
Vinay Kalia184cd0f2013-04-29 18:26:42 -07001600 if (!ret) {
Arun Menon906de572013-06-18 17:01:40 -07001601 async_thread_created = true;
1602 ret = pthread_create(&async_thread_id,0,async_message_thread,this);
1603 }
1604 if (ret) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001605 DEBUG_PRINT_ERROR("Failed to create async_message_thread");
Arun Menon906de572013-06-18 17:01:40 -07001606 async_thread_created = false;
1607 return OMX_ErrorInsufficientResources;
Vinay Kaliadae8ad62013-04-26 20:42:10 -07001608 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07001609
Shalaj Jain273b3e02012-06-22 19:08:03 -07001610#ifdef OUTPUT_EXTRADATA_LOG
Deva Ramasubramanianee6f1f42014-01-31 12:49:18 -08001611 outputExtradataFile = fopen (output_extradata_filename, "ab");
Shalaj Jain273b3e02012-06-22 19:08:03 -07001612#endif
1613
Arun Menon906de572013-06-18 17:01:40 -07001614 // Copy the role information which provides the decoder kind
1615 strlcpy(drv_ctx.kind,role,128);
Vinay Kalia53fa6832012-10-11 17:55:30 -07001616
Arun Menon906de572013-06-18 17:01:40 -07001617 if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
1618 OMX_MAX_STRINGNAME_SIZE)) {
1619 strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
1620 OMX_MAX_STRINGNAME_SIZE);
1621 drv_ctx.timestamp_adjust = true;
1622 drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
1623 eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1624 output_capability=V4L2_PIX_FMT_MPEG4;
1625 /*Initialize Start Code for MPEG4*/
1626 codec_type_parse = CODEC_TYPE_MPEG4;
1627 m_frame_parser.init_start_codes (codec_type_parse);
Arun Menon906de572013-06-18 17:01:40 -07001628 } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
1629 OMX_MAX_STRINGNAME_SIZE)) {
1630 strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
1631 OMX_MAX_STRINGNAME_SIZE);
1632 drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
1633 output_capability = V4L2_PIX_FMT_MPEG2;
1634 eCompressionFormat = OMX_VIDEO_CodingMPEG2;
1635 /*Initialize Start Code for MPEG2*/
1636 codec_type_parse = CODEC_TYPE_MPEG2;
1637 m_frame_parser.init_start_codes (codec_type_parse);
Arun Menon906de572013-06-18 17:01:40 -07001638 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
1639 OMX_MAX_STRINGNAME_SIZE)) {
1640 strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001641 DEBUG_PRINT_LOW("H263 Decoder selected");
Arun Menon906de572013-06-18 17:01:40 -07001642 drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
1643 eCompressionFormat = OMX_VIDEO_CodingH263;
1644 output_capability = V4L2_PIX_FMT_H263;
1645 codec_type_parse = CODEC_TYPE_H263;
1646 m_frame_parser.init_start_codes (codec_type_parse);
Arun Menon906de572013-06-18 17:01:40 -07001647 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
1648 OMX_MAX_STRINGNAME_SIZE)) {
1649 strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001650 DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
Arun Menon906de572013-06-18 17:01:40 -07001651 drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
1652 output_capability = V4L2_PIX_FMT_DIVX_311;
1653 eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1654 codec_type_parse = CODEC_TYPE_DIVX;
1655 m_frame_parser.init_start_codes (codec_type_parse);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001656
Arun Menon906de572013-06-18 17:01:40 -07001657 eRet = createDivxDrmContext();
1658 if (eRet != OMX_ErrorNone) {
1659 DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1660 return eRet;
1661 }
1662 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
1663 OMX_MAX_STRINGNAME_SIZE)) {
1664 strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001665 DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
Arun Menon906de572013-06-18 17:01:40 -07001666 drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
1667 output_capability = V4L2_PIX_FMT_DIVX;
1668 eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1669 codec_type_parse = CODEC_TYPE_DIVX;
1670 codec_ambiguous = true;
1671 m_frame_parser.init_start_codes (codec_type_parse);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001672
Arun Menon906de572013-06-18 17:01:40 -07001673 eRet = createDivxDrmContext();
1674 if (eRet != OMX_ErrorNone) {
1675 DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1676 return eRet;
1677 }
1678 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
1679 OMX_MAX_STRINGNAME_SIZE)) {
1680 strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001681 DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
Arun Menon906de572013-06-18 17:01:40 -07001682 drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
1683 output_capability = V4L2_PIX_FMT_DIVX;
1684 eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1685 codec_type_parse = CODEC_TYPE_DIVX;
1686 codec_ambiguous = true;
1687 m_frame_parser.init_start_codes (codec_type_parse);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001688
Arun Menon906de572013-06-18 17:01:40 -07001689 eRet = createDivxDrmContext();
1690 if (eRet != OMX_ErrorNone) {
1691 DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1692 return eRet;
1693 }
Deva Ramasubramanian9403f022012-11-28 18:27:53 -08001694
Arun Menon906de572013-06-18 17:01:40 -07001695 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
1696 OMX_MAX_STRINGNAME_SIZE)) {
1697 strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
1698 drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
1699 output_capability=V4L2_PIX_FMT_H264;
1700 eCompressionFormat = OMX_VIDEO_CodingAVC;
1701 codec_type_parse = CODEC_TYPE_H264;
1702 m_frame_parser.init_start_codes (codec_type_parse);
1703 m_frame_parser.init_nal_length(nal_length);
Arun Menon906de572013-06-18 17:01:40 -07001704 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
1705 OMX_MAX_STRINGNAME_SIZE)) {
1706 strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1707 drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
1708 eCompressionFormat = OMX_VIDEO_CodingWMV;
1709 codec_type_parse = CODEC_TYPE_VC1;
1710 output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
1711 m_frame_parser.init_start_codes (codec_type_parse);
Arun Menon906de572013-06-18 17:01:40 -07001712 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
1713 OMX_MAX_STRINGNAME_SIZE)) {
1714 strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1715 drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
1716 eCompressionFormat = OMX_VIDEO_CodingWMV;
1717 codec_type_parse = CODEC_TYPE_VC1;
1718 output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
1719 m_frame_parser.init_start_codes (codec_type_parse);
Arun Menon906de572013-06-18 17:01:40 -07001720 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", \
1721 OMX_MAX_STRINGNAME_SIZE)) {
1722 strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
1723 output_capability=V4L2_PIX_FMT_VP8;
Praveen Chavan76b71c32014-07-10 18:10:51 -07001724 eCompressionFormat = OMX_VIDEO_CodingVP8;
Arun Menon906de572013-06-18 17:01:40 -07001725 codec_type_parse = CODEC_TYPE_VP8;
1726 arbitrary_bytes = false;
Praneeth Paladugu2b2ef2d2013-04-10 22:04:51 -07001727
Arun Menon906de572013-06-18 17:01:40 -07001728 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001729 DEBUG_PRINT_ERROR("ERROR:Unknown Component");
Arun Menon906de572013-06-18 17:01:40 -07001730 eRet = OMX_ErrorInvalidComponentName;
1731 }
Arun Menon906de572013-06-18 17:01:40 -07001732 if (eRet == OMX_ErrorNone) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07001733
Arun Menon906de572013-06-18 17:01:40 -07001734 drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
Vinay Kaliada4f4422013-01-09 10:45:03 -08001735 OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
1736 QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1737 if (!client_buffers.set_color_format(dest_color_format)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001738 DEBUG_PRINT_ERROR("Setting color format failed");
Vinay Kaliada4f4422013-01-09 10:45:03 -08001739 eRet = OMX_ErrorInsufficientResources;
1740 }
1741
Arun Menon906de572013-06-18 17:01:40 -07001742 capture_capability= V4L2_PIX_FMT_NV12;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001743
Arun Menon906de572013-06-18 17:01:40 -07001744 struct v4l2_capability cap;
1745 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
1746 if (ret) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001747 DEBUG_PRINT_ERROR("Failed to query capabilities");
Arun Menon906de572013-06-18 17:01:40 -07001748 /*TODO: How to handle this case */
1749 } else {
1750 DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001751 " version = %d, capabilities = %x", cap.driver, cap.card,
Arun Menon906de572013-06-18 17:01:40 -07001752 cap.bus_info, cap.version, cap.capabilities);
1753 }
1754 ret=0;
1755 fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1756 fdesc.index=0;
1757 while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001758 DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
Arun Menon906de572013-06-18 17:01:40 -07001759 fdesc.pixelformat, fdesc.flags);
1760 fdesc.index++;
1761 }
1762 fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1763 fdesc.index=0;
1764 while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07001765
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001766 DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
Arun Menon906de572013-06-18 17:01:40 -07001767 fdesc.pixelformat, fdesc.flags);
1768 fdesc.index++;
1769 }
Deva Ramasubramanian3c55b212013-06-18 15:03:49 -07001770 update_resolution(320, 240, 320, 240);
Arun Menon906de572013-06-18 17:01:40 -07001771 fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1772 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1773 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1774 fmt.fmt.pix_mp.pixelformat = output_capability;
1775 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1776 if (ret) {
1777 /*TODO: How to handle this case */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001778 DEBUG_PRINT_ERROR("Failed to set format on output port");
Arun Menon906de572013-06-18 17:01:40 -07001779 return OMX_ErrorInsufficientResources;
1780 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001781 DEBUG_PRINT_HIGH("Set Format was successful");
Arun Menon906de572013-06-18 17:01:40 -07001782 if (codec_ambiguous) {
1783 if (output_capability == V4L2_PIX_FMT_DIVX) {
1784 struct v4l2_control divx_ctrl;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001785
Arun Menon906de572013-06-18 17:01:40 -07001786 if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
1787 divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
1788 } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
1789 divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
1790 } else {
1791 divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
1792 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07001793
Arun Menon906de572013-06-18 17:01:40 -07001794 divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
1795 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
1796 if (ret) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001797 DEBUG_PRINT_ERROR("Failed to set divx version");
Arun Menon906de572013-06-18 17:01:40 -07001798 }
1799 } else {
1800 DEBUG_PRINT_ERROR("Codec should not be ambiguous");
1801 }
1802 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07001803
Jia Meng3a3c6492013-12-19 17:16:52 +08001804 property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR);
1805 m_conceal_color= atoi(property_value);
1806 DEBUG_PRINT_HIGH("trying to set 0x%x as conceal color\n",m_conceal_color);
1807 control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR;
1808 control.value = m_conceal_color;
1809 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
1810 if (ret) {
1811 DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret);
1812 }
1813
Arun Menon906de572013-06-18 17:01:40 -07001814 //Get the hardware capabilities
1815 memset((void *)&frmsize,0,sizeof(frmsize));
1816 frmsize.index = 0;
1817 frmsize.pixel_format = output_capability;
1818 ret = ioctl(drv_ctx.video_driver_fd,
1819 VIDIOC_ENUM_FRAMESIZES, &frmsize);
1820 if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001821 DEBUG_PRINT_ERROR("Failed to get framesizes");
Arun Menon906de572013-06-18 17:01:40 -07001822 return OMX_ErrorHardware;
1823 }
Deva Ramasubramanian3c55b212013-06-18 15:03:49 -07001824
Arun Menon906de572013-06-18 17:01:40 -07001825 if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
1826 m_decoder_capability.min_width = frmsize.stepwise.min_width;
1827 m_decoder_capability.max_width = frmsize.stepwise.max_width;
1828 m_decoder_capability.min_height = frmsize.stepwise.min_height;
1829 m_decoder_capability.max_height = frmsize.stepwise.max_height;
1830 }
Deva Ramasubramanian3c55b212013-06-18 15:03:49 -07001831
Arun Menon906de572013-06-18 17:01:40 -07001832 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1833 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1834 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1835 fmt.fmt.pix_mp.pixelformat = capture_capability;
1836 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1837 if (ret) {
1838 /*TODO: How to handle this case */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001839 DEBUG_PRINT_ERROR("Failed to set format on capture port");
Arun Menon906de572013-06-18 17:01:40 -07001840 }
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +05301841 memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE));
1842 framesize.nWidth = drv_ctx.video_resolution.frame_width;
1843 framesize.nHeight = drv_ctx.video_resolution.frame_height;
1844
1845 memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE));
1846 rectangle.nWidth = drv_ctx.video_resolution.frame_width;
1847 rectangle.nHeight = drv_ctx.video_resolution.frame_height;
1848
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001849 DEBUG_PRINT_HIGH("Set Format was successful");
Arun Menon906de572013-06-18 17:01:40 -07001850 if (secure_mode) {
1851 control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
1852 control.value = 1;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001853 DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
Arun Menon906de572013-06-18 17:01:40 -07001854 ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
1855 if (ret) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001856 DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
Arun Menon906de572013-06-18 17:01:40 -07001857 return OMX_ErrorInsufficientResources;
1858 }
1859 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07001860
Arun Menon906de572013-06-18 17:01:40 -07001861 /*Get the Buffer requirements for input and output ports*/
1862 drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
1863 drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
1864 if (secure_mode) {
1865 drv_ctx.op_buf.alignment=SZ_1M;
1866 drv_ctx.ip_buf.alignment=SZ_1M;
1867 } else {
1868 drv_ctx.op_buf.alignment=SZ_4K;
1869 drv_ctx.ip_buf.alignment=SZ_4K;
1870 }
1871 drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1872 drv_ctx.extradata = 0;
1873 drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
1874 control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
1875 control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
1876 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
1877 drv_ctx.idr_only_decoding = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001878
Vinay Kalia5713bb32013-01-16 18:39:59 -08001879 m_state = OMX_StateLoaded;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001880#ifdef DEFAULT_EXTRADATA
Arun Menonf8908a62013-12-20 17:36:21 -08001881 if (strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",
1882 OMX_MAX_STRINGNAME_SIZE) && (eRet == OMX_ErrorNone))
1883 enable_extradata(DEFAULT_EXTRADATA, true, true);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001884#endif
Vinay Kalia5713bb32013-01-16 18:39:59 -08001885 eRet=get_buffer_req(&drv_ctx.ip_buf);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001886 DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size);
Vinay Kalia5713bb32013-01-16 18:39:59 -08001887 get_buffer_req(&drv_ctx.op_buf);
Arun Menon906de572013-06-18 17:01:40 -07001888 if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
1889 if (m_frame_parser.mutils == NULL) {
1890 m_frame_parser.mutils = new H264_Utils();
Shalaj Jain273b3e02012-06-22 19:08:03 -07001891
Arun Menon906de572013-06-18 17:01:40 -07001892 if (m_frame_parser.mutils == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001893 DEBUG_PRINT_ERROR("parser utils Allocation failed ");
Arun Menon906de572013-06-18 17:01:40 -07001894 eRet = OMX_ErrorInsufficientResources;
1895 } else {
1896 h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
1897 h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
1898 h264_scratch.nFilledLen = 0;
1899 h264_scratch.nOffset = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001900
Arun Menon906de572013-06-18 17:01:40 -07001901 if (h264_scratch.pBuffer == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001902 DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
Arun Menon906de572013-06-18 17:01:40 -07001903 return OMX_ErrorInsufficientResources;
1904 }
1905 m_frame_parser.mutils->initialize_frame_checking_environment();
1906 m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
1907 }
1908 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07001909
Arun Menon906de572013-06-18 17:01:40 -07001910 h264_parser = new h264_stream_parser();
1911 if (!h264_parser) {
1912 DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
1913 eRet = OMX_ErrorInsufficientResources;
1914 }
1915 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07001916
Arun Menon906de572013-06-18 17:01:40 -07001917 if (pipe(fds)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001918 DEBUG_PRINT_ERROR("pipe creation failed");
Arun Menon906de572013-06-18 17:01:40 -07001919 eRet = OMX_ErrorInsufficientResources;
1920 } else {
1921 int temp1[2];
1922 if (fds[0] == 0 || fds[1] == 0) {
1923 if (pipe (temp1)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001924 DEBUG_PRINT_ERROR("pipe creation failed");
Arun Menon906de572013-06-18 17:01:40 -07001925 return OMX_ErrorInsufficientResources;
1926 }
1927 //close (fds[0]);
1928 //close (fds[1]);
1929 fds[0] = temp1 [0];
1930 fds[1] = temp1 [1];
1931 }
1932 m_pipe_in = fds[0];
1933 m_pipe_out = fds[1];
1934 msg_thread_created = true;
1935 r = pthread_create(&msg_thread_id,0,message_thread,this);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001936
Arun Menon906de572013-06-18 17:01:40 -07001937 if (r < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001938 DEBUG_PRINT_ERROR("component_init(): message_thread creation failed");
Arun Menon906de572013-06-18 17:01:40 -07001939 msg_thread_created = false;
1940 eRet = OMX_ErrorInsufficientResources;
1941 }
1942 }
1943 }
1944
1945 if (eRet != OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001946 DEBUG_PRINT_ERROR("Component Init Failed");
Arun Menon906de572013-06-18 17:01:40 -07001947 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001948 DEBUG_PRINT_HIGH("omx_vdec::component_init() success");
Arun Menon906de572013-06-18 17:01:40 -07001949 }
1950 //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
1951 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001952}
1953
1954/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07001955 FUNCTION
1956 omx_vdec::GetComponentVersion
Shalaj Jain273b3e02012-06-22 19:08:03 -07001957
Arun Menon906de572013-06-18 17:01:40 -07001958 DESCRIPTION
1959 Returns the component version.
Shalaj Jain273b3e02012-06-22 19:08:03 -07001960
Arun Menon906de572013-06-18 17:01:40 -07001961 PARAMETERS
1962 TBD.
Shalaj Jain273b3e02012-06-22 19:08:03 -07001963
Arun Menon906de572013-06-18 17:01:40 -07001964 RETURN VALUE
1965 OMX_ErrorNone.
Shalaj Jain273b3e02012-06-22 19:08:03 -07001966
Arun Menon906de572013-06-18 17:01:40 -07001967 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07001968OMX_ERRORTYPE omx_vdec::get_component_version
Arun Menon906de572013-06-18 17:01:40 -07001969(
1970 OMX_IN OMX_HANDLETYPE hComp,
1971 OMX_OUT OMX_STRING componentName,
1972 OMX_OUT OMX_VERSIONTYPE* componentVersion,
1973 OMX_OUT OMX_VERSIONTYPE* specVersion,
1974 OMX_OUT OMX_UUIDTYPE* componentUUID
1975 )
Shalaj Jain273b3e02012-06-22 19:08:03 -07001976{
Arun Menon906de572013-06-18 17:01:40 -07001977 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07001978 DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
Shalaj Jain273b3e02012-06-22 19:08:03 -07001979 return OMX_ErrorInvalidState;
1980 }
Arun Menon906de572013-06-18 17:01:40 -07001981 /* TBD -- Return the proper version */
1982 if (specVersion) {
1983 specVersion->nVersion = OMX_SPEC_VERSION;
1984 }
1985 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07001986}
1987/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07001988 FUNCTION
1989 omx_vdec::SendCommand
Shalaj Jain273b3e02012-06-22 19:08:03 -07001990
Arun Menon906de572013-06-18 17:01:40 -07001991 DESCRIPTION
1992 Returns zero if all the buffers released..
Shalaj Jain273b3e02012-06-22 19:08:03 -07001993
Arun Menon906de572013-06-18 17:01:40 -07001994 PARAMETERS
1995 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07001996
Arun Menon906de572013-06-18 17:01:40 -07001997 RETURN VALUE
1998 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07001999
Arun Menon906de572013-06-18 17:01:40 -07002000 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07002001OMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07002002 OMX_IN OMX_COMMANDTYPE cmd,
2003 OMX_IN OMX_U32 param1,
2004 OMX_IN OMX_PTR cmdData
2005 )
Shalaj Jain273b3e02012-06-22 19:08:03 -07002006{
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002007 DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
Arun Menon906de572013-06-18 17:01:40 -07002008 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002009 DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002010 return OMX_ErrorInvalidState;
2011 }
2012 if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
Arun Menon906de572013-06-18 17:01:40 -07002013 && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002014 DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
Arun Menon906de572013-06-18 17:01:40 -07002015 "to invalid port: %lu", param1);
2016 return OMX_ErrorBadPortIndex;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002017 }
Deva Ramasubramanian1fd93812014-03-26 15:17:15 -07002018
Shalaj Jain273b3e02012-06-22 19:08:03 -07002019 post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
2020 sem_wait(&m_cmd_lock);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002021 DEBUG_PRINT_LOW("send_command: Command Processed");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002022 return OMX_ErrorNone;
2023}
2024
2025/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07002026 FUNCTION
2027 omx_vdec::SendCommand
Shalaj Jain273b3e02012-06-22 19:08:03 -07002028
Arun Menon906de572013-06-18 17:01:40 -07002029 DESCRIPTION
2030 Returns zero if all the buffers released..
Shalaj Jain273b3e02012-06-22 19:08:03 -07002031
Arun Menon906de572013-06-18 17:01:40 -07002032 PARAMETERS
2033 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002034
Arun Menon906de572013-06-18 17:01:40 -07002035 RETURN VALUE
2036 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07002037
Arun Menon906de572013-06-18 17:01:40 -07002038 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07002039OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07002040 OMX_IN OMX_COMMANDTYPE cmd,
2041 OMX_IN OMX_U32 param1,
2042 OMX_IN OMX_PTR cmdData
2043 )
Shalaj Jain273b3e02012-06-22 19:08:03 -07002044{
Arun Menon906de572013-06-18 17:01:40 -07002045 OMX_ERRORTYPE eRet = OMX_ErrorNone;
2046 OMX_STATETYPE eState = (OMX_STATETYPE) param1;
2047 int bFlag = 1,sem_posted = 0,ret=0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002048
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002049 DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
2050 DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
Arun Menon906de572013-06-18 17:01:40 -07002051 m_state, eState);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002052
Arun Menon906de572013-06-18 17:01:40 -07002053 if (cmd == OMX_CommandStateSet) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002054 DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
2055 DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
Arun Menon906de572013-06-18 17:01:40 -07002056 /***************************/
2057 /* Current State is Loaded */
2058 /***************************/
2059 if (m_state == OMX_StateLoaded) {
2060 if (eState == OMX_StateIdle) {
2061 //if all buffers are allocated or all ports disabled
2062 if (allocate_done() ||
2063 (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002064 DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
Arun Menon906de572013-06-18 17:01:40 -07002065 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002066 DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
Arun Menon906de572013-06-18 17:01:40 -07002067 BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
2068 // Skip the event notification
2069 bFlag = 0;
2070 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002071 }
Arun Menon906de572013-06-18 17:01:40 -07002072 /* Requesting transition from Loaded to Loaded */
2073 else if (eState == OMX_StateLoaded) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002074 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
Arun Menon906de572013-06-18 17:01:40 -07002075 post_event(OMX_EventError,OMX_ErrorSameState,\
2076 OMX_COMPONENT_GENERATE_EVENT);
2077 eRet = OMX_ErrorSameState;
2078 }
2079 /* Requesting transition from Loaded to WaitForResources */
2080 else if (eState == OMX_StateWaitForResources) {
2081 /* Since error is None , we will post an event
2082 at the end of this function definition */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002083 DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
Arun Menon906de572013-06-18 17:01:40 -07002084 }
2085 /* Requesting transition from Loaded to Executing */
2086 else if (eState == OMX_StateExecuting) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002087 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
Arun Menon906de572013-06-18 17:01:40 -07002088 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2089 OMX_COMPONENT_GENERATE_EVENT);
2090 eRet = OMX_ErrorIncorrectStateTransition;
2091 }
2092 /* Requesting transition from Loaded to Pause */
2093 else if (eState == OMX_StatePause) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002094 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
Arun Menon906de572013-06-18 17:01:40 -07002095 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2096 OMX_COMPONENT_GENERATE_EVENT);
2097 eRet = OMX_ErrorIncorrectStateTransition;
2098 }
2099 /* Requesting transition from Loaded to Invalid */
2100 else if (eState == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002101 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
Arun Menon906de572013-06-18 17:01:40 -07002102 post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2103 eRet = OMX_ErrorInvalidState;
2104 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002105 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
Arun Menon906de572013-06-18 17:01:40 -07002106 eState);
2107 eRet = OMX_ErrorBadParameter;
2108 }
2109 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002110
Arun Menon906de572013-06-18 17:01:40 -07002111 /***************************/
2112 /* Current State is IDLE */
2113 /***************************/
2114 else if (m_state == OMX_StateIdle) {
2115 if (eState == OMX_StateLoaded) {
2116 if (release_done()) {
2117 /*
2118 Since error is None , we will post an event at the end
2119 of this function definition
2120 */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002121 DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
Arun Menon906de572013-06-18 17:01:40 -07002122 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002123 DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
Arun Menon906de572013-06-18 17:01:40 -07002124 BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
2125 // Skip the event notification
2126 bFlag = 0;
2127 }
2128 }
2129 /* Requesting transition from Idle to Executing */
2130 else if (eState == OMX_StateExecuting) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002131 DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
Arun Menon906de572013-06-18 17:01:40 -07002132 //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
2133 bFlag = 1;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002134 DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
Arun Menon906de572013-06-18 17:01:40 -07002135 m_state=OMX_StateExecuting;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002136 DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
Arun Menon906de572013-06-18 17:01:40 -07002137 }
2138 /* Requesting transition from Idle to Idle */
2139 else if (eState == OMX_StateIdle) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002140 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
Arun Menon906de572013-06-18 17:01:40 -07002141 post_event(OMX_EventError,OMX_ErrorSameState,\
2142 OMX_COMPONENT_GENERATE_EVENT);
2143 eRet = OMX_ErrorSameState;
2144 }
2145 /* Requesting transition from Idle to WaitForResources */
2146 else if (eState == OMX_StateWaitForResources) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002147 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
Arun Menon906de572013-06-18 17:01:40 -07002148 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2149 OMX_COMPONENT_GENERATE_EVENT);
2150 eRet = OMX_ErrorIncorrectStateTransition;
2151 }
2152 /* Requesting transition from Idle to Pause */
2153 else if (eState == OMX_StatePause) {
2154 /*To pause the Video core we need to start the driver*/
2155 if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
2156 NULL) < */0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002157 DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
Arun Menon906de572013-06-18 17:01:40 -07002158 omx_report_error ();
2159 eRet = OMX_ErrorHardware;
2160 } else {
2161 BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002162 DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
Arun Menon906de572013-06-18 17:01:40 -07002163 bFlag = 0;
2164 }
2165 }
2166 /* Requesting transition from Idle to Invalid */
2167 else if (eState == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002168 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
Arun Menon906de572013-06-18 17:01:40 -07002169 post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2170 eRet = OMX_ErrorInvalidState;
2171 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002172 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
Arun Menon906de572013-06-18 17:01:40 -07002173 eRet = OMX_ErrorBadParameter;
2174 }
2175 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002176
Arun Menon906de572013-06-18 17:01:40 -07002177 /******************************/
2178 /* Current State is Executing */
2179 /******************************/
2180 else if (m_state == OMX_StateExecuting) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002181 DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
Arun Menon906de572013-06-18 17:01:40 -07002182 /* Requesting transition from Executing to Idle */
2183 if (eState == OMX_StateIdle) {
2184 /* Since error is None , we will post an event
2185 at the end of this function definition
2186 */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002187 DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
Arun Menon906de572013-06-18 17:01:40 -07002188 BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
2189 if (!sem_posted) {
2190 sem_posted = 1;
2191 sem_post (&m_cmd_lock);
2192 execute_omx_flush(OMX_ALL);
2193 }
2194 bFlag = 0;
2195 }
2196 /* Requesting transition from Executing to Paused */
2197 else if (eState == OMX_StatePause) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002198 DEBUG_PRINT_LOW("PAUSE Command Issued");
Arun Menon906de572013-06-18 17:01:40 -07002199 m_state = OMX_StatePause;
2200 bFlag = 1;
2201 }
2202 /* Requesting transition from Executing to Loaded */
2203 else if (eState == OMX_StateLoaded) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002204 DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
Arun Menon906de572013-06-18 17:01:40 -07002205 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2206 OMX_COMPONENT_GENERATE_EVENT);
2207 eRet = OMX_ErrorIncorrectStateTransition;
2208 }
2209 /* Requesting transition from Executing to WaitForResources */
2210 else if (eState == OMX_StateWaitForResources) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002211 DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
Arun Menon906de572013-06-18 17:01:40 -07002212 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2213 OMX_COMPONENT_GENERATE_EVENT);
2214 eRet = OMX_ErrorIncorrectStateTransition;
2215 }
2216 /* Requesting transition from Executing to Executing */
2217 else if (eState == OMX_StateExecuting) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002218 DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
Arun Menon906de572013-06-18 17:01:40 -07002219 post_event(OMX_EventError,OMX_ErrorSameState,\
2220 OMX_COMPONENT_GENERATE_EVENT);
2221 eRet = OMX_ErrorSameState;
2222 }
2223 /* Requesting transition from Executing to Invalid */
2224 else if (eState == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002225 DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
Arun Menon906de572013-06-18 17:01:40 -07002226 post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2227 eRet = OMX_ErrorInvalidState;
2228 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002229 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
Arun Menon906de572013-06-18 17:01:40 -07002230 eRet = OMX_ErrorBadParameter;
2231 }
2232 }
2233 /***************************/
2234 /* Current State is Pause */
2235 /***************************/
2236 else if (m_state == OMX_StatePause) {
2237 /* Requesting transition from Pause to Executing */
2238 if (eState == OMX_StateExecuting) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002239 DEBUG_PRINT_LOW("Pause --> Executing");
Arun Menon906de572013-06-18 17:01:40 -07002240 m_state = OMX_StateExecuting;
2241 bFlag = 1;
2242 }
2243 /* Requesting transition from Pause to Idle */
2244 else if (eState == OMX_StateIdle) {
2245 /* Since error is None , we will post an event
2246 at the end of this function definition */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002247 DEBUG_PRINT_LOW("Pause --> Idle");
Arun Menon906de572013-06-18 17:01:40 -07002248 BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
2249 if (!sem_posted) {
2250 sem_posted = 1;
2251 sem_post (&m_cmd_lock);
2252 execute_omx_flush(OMX_ALL);
2253 }
2254 bFlag = 0;
2255 }
2256 /* Requesting transition from Pause to loaded */
2257 else if (eState == OMX_StateLoaded) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002258 DEBUG_PRINT_ERROR("Pause --> loaded");
Arun Menon906de572013-06-18 17:01:40 -07002259 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2260 OMX_COMPONENT_GENERATE_EVENT);
2261 eRet = OMX_ErrorIncorrectStateTransition;
2262 }
2263 /* Requesting transition from Pause to WaitForResources */
2264 else if (eState == OMX_StateWaitForResources) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002265 DEBUG_PRINT_ERROR("Pause --> WaitForResources");
Arun Menon906de572013-06-18 17:01:40 -07002266 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2267 OMX_COMPONENT_GENERATE_EVENT);
2268 eRet = OMX_ErrorIncorrectStateTransition;
2269 }
2270 /* Requesting transition from Pause to Pause */
2271 else if (eState == OMX_StatePause) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002272 DEBUG_PRINT_ERROR("Pause --> Pause");
Arun Menon906de572013-06-18 17:01:40 -07002273 post_event(OMX_EventError,OMX_ErrorSameState,\
2274 OMX_COMPONENT_GENERATE_EVENT);
2275 eRet = OMX_ErrorSameState;
2276 }
2277 /* Requesting transition from Pause to Invalid */
2278 else if (eState == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002279 DEBUG_PRINT_ERROR("Pause --> Invalid");
Arun Menon906de572013-06-18 17:01:40 -07002280 post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2281 eRet = OMX_ErrorInvalidState;
2282 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002283 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
Arun Menon906de572013-06-18 17:01:40 -07002284 eRet = OMX_ErrorBadParameter;
2285 }
2286 }
2287 /***************************/
2288 /* Current State is WaitForResources */
2289 /***************************/
2290 else if (m_state == OMX_StateWaitForResources) {
2291 /* Requesting transition from WaitForResources to Loaded */
2292 if (eState == OMX_StateLoaded) {
2293 /* Since error is None , we will post an event
2294 at the end of this function definition */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002295 DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
Arun Menon906de572013-06-18 17:01:40 -07002296 }
2297 /* Requesting transition from WaitForResources to WaitForResources */
2298 else if (eState == OMX_StateWaitForResources) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002299 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
Arun Menon906de572013-06-18 17:01:40 -07002300 post_event(OMX_EventError,OMX_ErrorSameState,
2301 OMX_COMPONENT_GENERATE_EVENT);
2302 eRet = OMX_ErrorSameState;
2303 }
2304 /* Requesting transition from WaitForResources to Executing */
2305 else if (eState == OMX_StateExecuting) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002306 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
Arun Menon906de572013-06-18 17:01:40 -07002307 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2308 OMX_COMPONENT_GENERATE_EVENT);
2309 eRet = OMX_ErrorIncorrectStateTransition;
2310 }
2311 /* Requesting transition from WaitForResources to Pause */
2312 else if (eState == OMX_StatePause) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002313 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
Arun Menon906de572013-06-18 17:01:40 -07002314 post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2315 OMX_COMPONENT_GENERATE_EVENT);
2316 eRet = OMX_ErrorIncorrectStateTransition;
2317 }
2318 /* Requesting transition from WaitForResources to Invalid */
2319 else if (eState == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002320 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
Arun Menon906de572013-06-18 17:01:40 -07002321 post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2322 eRet = OMX_ErrorInvalidState;
2323 }
2324 /* Requesting transition from WaitForResources to Loaded -
2325 is NOT tested by Khronos TS */
2326
2327 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002328 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
Arun Menon906de572013-06-18 17:01:40 -07002329 eRet = OMX_ErrorBadParameter;
2330 }
2331 }
2332 /********************************/
2333 /* Current State is Invalid */
2334 /*******************************/
2335 else if (m_state == OMX_StateInvalid) {
2336 /* State Transition from Inavlid to any state */
2337 if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
2338 || OMX_StateIdle || OMX_StateExecuting
2339 || OMX_StatePause || OMX_StateInvalid)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002340 DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
Arun Menon906de572013-06-18 17:01:40 -07002341 post_event(OMX_EventError,OMX_ErrorInvalidState,\
2342 OMX_COMPONENT_GENERATE_EVENT);
2343 eRet = OMX_ErrorInvalidState;
2344 }
2345 } else if (cmd == OMX_CommandFlush) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002346 DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
Arun Menon906de572013-06-18 17:01:40 -07002347 "with param1: %lu", param1);
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07002348#ifdef _MSM8974_
2349 send_codec_config();
2350#endif
Srinu Gorleaf1b9fb2014-08-29 19:40:27 +05302351 if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX ||
2352 param1 == OMX_ALL)) {
2353 while (android_atomic_add(0, &m_queued_codec_config_count) > 0) {
2354 struct timespec ts;
2355
2356 clock_gettime(CLOCK_REALTIME, &ts);
2357 ts.tv_sec += 2;
2358 DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ",
2359 m_queued_codec_config_count);
2360 if (sem_timedwait(&m_safe_flush, &ts)) {
2361 DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers");
2362 break;
2363 }
2364 }
2365 }
2366
Arun Menon906de572013-06-18 17:01:40 -07002367 if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
2368 BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
2369 }
2370 if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
2371 BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
2372 }
2373 if (!sem_posted) {
2374 sem_posted = 1;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002375 DEBUG_PRINT_LOW("Set the Semaphore");
Arun Menon906de572013-06-18 17:01:40 -07002376 sem_post (&m_cmd_lock);
2377 execute_omx_flush(param1);
2378 }
2379 bFlag = 0;
2380 } else if ( cmd == OMX_CommandPortEnable) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002381 DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
Arun Menon906de572013-06-18 17:01:40 -07002382 "with param1: %lu", param1);
2383 if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
2384 m_inp_bEnabled = OMX_TRUE;
2385
2386 if ( (m_state == OMX_StateLoaded &&
2387 !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2388 || allocate_input_done()) {
2389 post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
2390 OMX_COMPONENT_GENERATE_EVENT);
2391 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002392 DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
Arun Menon906de572013-06-18 17:01:40 -07002393 BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
2394 // Skip the event notification
2395 bFlag = 0;
2396 }
2397 }
2398 if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002399 DEBUG_PRINT_LOW("Enable output Port command recieved");
Arun Menon906de572013-06-18 17:01:40 -07002400 m_out_bEnabled = OMX_TRUE;
2401
2402 if ( (m_state == OMX_StateLoaded &&
2403 !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2404 || (allocate_output_done())) {
2405 post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2406 OMX_COMPONENT_GENERATE_EVENT);
2407
2408 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002409 DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
Arun Menon906de572013-06-18 17:01:40 -07002410 BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
2411 // Skip the event notification
2412 bFlag = 0;
2413 }
2414 }
2415 } else if (cmd == OMX_CommandPortDisable) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002416 DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
Arun Menon906de572013-06-18 17:01:40 -07002417 "with param1: %lu", param1);
2418 if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07002419 codec_config_flag = false;
Arun Menon906de572013-06-18 17:01:40 -07002420 m_inp_bEnabled = OMX_FALSE;
2421 if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2422 && release_input_done()) {
2423 post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2424 OMX_COMPONENT_GENERATE_EVENT);
2425 } else {
2426 BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
2427 if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
2428 if (!sem_posted) {
2429 sem_posted = 1;
2430 sem_post (&m_cmd_lock);
2431 }
2432 execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
2433 }
2434
2435 // Skip the event notification
2436 bFlag = 0;
2437 }
2438 }
2439 if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
2440 m_out_bEnabled = OMX_FALSE;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002441 DEBUG_PRINT_LOW("Disable output Port command recieved");
Arun Menon906de572013-06-18 17:01:40 -07002442 if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2443 && release_output_done()) {
2444 post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2445 OMX_COMPONENT_GENERATE_EVENT);
2446 } else {
2447 BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
2448 if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
2449 if (!sem_posted) {
2450 sem_posted = 1;
2451 sem_post (&m_cmd_lock);
2452 }
2453 BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
2454 execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
2455 }
2456 // Skip the event notification
2457 bFlag = 0;
2458
2459 }
2460 }
2461 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002462 DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
Arun Menon906de572013-06-18 17:01:40 -07002463 eRet = OMX_ErrorNotImplemented;
2464 }
2465 if (eRet == OMX_ErrorNone && bFlag) {
2466 post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
2467 }
2468 if (!sem_posted) {
2469 sem_post(&m_cmd_lock);
2470 }
2471
2472 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002473}
2474
2475/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07002476 FUNCTION
2477 omx_vdec::ExecuteOmxFlush
Shalaj Jain273b3e02012-06-22 19:08:03 -07002478
Arun Menon906de572013-06-18 17:01:40 -07002479 DESCRIPTION
2480 Executes the OMX flush.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002481
Arun Menon906de572013-06-18 17:01:40 -07002482 PARAMETERS
2483 flushtype - input flush(1)/output flush(0)/ both.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002484
Arun Menon906de572013-06-18 17:01:40 -07002485 RETURN VALUE
2486 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07002487
Arun Menon906de572013-06-18 17:01:40 -07002488 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07002489bool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2490{
Arun Menon906de572013-06-18 17:01:40 -07002491 bool bRet = false;
2492 struct v4l2_plane plane;
2493 struct v4l2_buffer v4l2_buf;
2494 struct v4l2_decoder_cmd dec;
Surajit Podderd2644d52013-08-28 17:59:06 +05302495 DEBUG_PRINT_LOW("in %s, flushing %lu", __func__, flushType);
Arun Menon906de572013-06-18 17:01:40 -07002496 memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
2497 dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
Deva Ramasubramaniancc8fb902013-05-07 18:19:14 -07002498
Arun Menon906de572013-06-18 17:01:40 -07002499 DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
Deva Ramasubramaniancc8fb902013-05-07 18:19:14 -07002500
Arun Menon906de572013-06-18 17:01:40 -07002501 if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) {
2502 output_flush_progress = true;
2503 dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
2504 } else {
2505 /* XXX: The driver/hardware does not support flushing of individual ports
2506 * in all states. So we pretty much need to flush both ports internally,
2507 * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
2508 * requested. Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
2509 * we automatically omit sending the FLUSH done for the "opposite" port. */
2510 input_flush_progress = true;
2511 output_flush_progress = true;
2512 dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
2513 }
Deva Ramasubramanian03c9c742012-07-02 15:00:15 -07002514
Arun Menon906de572013-06-18 17:01:40 -07002515 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002516 DEBUG_PRINT_ERROR("Flush Port (%lu) Failed ", flushType);
Arun Menon906de572013-06-18 17:01:40 -07002517 bRet = false;
2518 }
Deva Ramasubramanian03c9c742012-07-02 15:00:15 -07002519
Arun Menon906de572013-06-18 17:01:40 -07002520 return bRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002521}
2522/*=========================================================================
2523FUNCTION : execute_output_flush
2524
2525DESCRIPTION
Arun Menon906de572013-06-18 17:01:40 -07002526Executes the OMX flush at OUTPUT PORT.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002527
2528PARAMETERS
Arun Menon906de572013-06-18 17:01:40 -07002529None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002530
2531RETURN VALUE
Arun Menon906de572013-06-18 17:01:40 -07002532true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07002533==========================================================================*/
2534bool omx_vdec::execute_output_flush()
2535{
Arun Menon906de572013-06-18 17:01:40 -07002536 unsigned p1 = 0; // Parameter - 1
2537 unsigned p2 = 0; // Parameter - 2
2538 unsigned ident = 0;
2539 bool bRet = true;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002540
Arun Menon906de572013-06-18 17:01:40 -07002541 /*Generate FBD for all Buffers in the FTBq*/
2542 pthread_mutex_lock(&m_lock);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002543 DEBUG_PRINT_LOW("Initiate Output Flush");
vivek mehta79cff222014-01-22 12:17:07 -08002544
2545 //reset last render TS
2546 if(m_last_rendered_TS > 0) {
2547 m_last_rendered_TS = 0;
2548 }
vivek mehtaa75c69f2014-01-10 21:50:37 -08002549
Arun Menon906de572013-06-18 17:01:40 -07002550 while (m_ftb_q.m_size) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002551 DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d",
Arun Menon906de572013-06-18 17:01:40 -07002552 m_ftb_q.m_size,pending_output_buffers);
2553 m_ftb_q.pop_entry(&p1,&p2,&ident);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002554 DEBUG_PRINT_LOW("ID(%x) P1(%x) P2(%x)", ident, p1, p2);
Arun Menon906de572013-06-18 17:01:40 -07002555 if (ident == m_fill_output_msg ) {
2556 m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2557 } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
2558 fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2559 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002560 }
Arun Menon906de572013-06-18 17:01:40 -07002561 pthread_mutex_unlock(&m_lock);
2562 output_flush_progress = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002563
Arun Menon906de572013-06-18 17:01:40 -07002564 if (arbitrary_bytes) {
2565 prev_ts = LLONG_MAX;
2566 rst_prev_ts = true;
2567 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002568 DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
Arun Menon906de572013-06-18 17:01:40 -07002569 return bRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002570}
2571/*=========================================================================
2572FUNCTION : execute_input_flush
2573
2574DESCRIPTION
Arun Menon906de572013-06-18 17:01:40 -07002575Executes the OMX flush at INPUT PORT.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002576
2577PARAMETERS
Arun Menon906de572013-06-18 17:01:40 -07002578None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002579
2580RETURN VALUE
Arun Menon906de572013-06-18 17:01:40 -07002581true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07002582==========================================================================*/
2583bool omx_vdec::execute_input_flush()
2584{
Arun Menon906de572013-06-18 17:01:40 -07002585 unsigned i =0;
2586 unsigned p1 = 0; // Parameter - 1
2587 unsigned p2 = 0; // Parameter - 2
2588 unsigned ident = 0;
2589 bool bRet = true;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002590
Arun Menon906de572013-06-18 17:01:40 -07002591 /*Generate EBD for all Buffers in the ETBq*/
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002592 DEBUG_PRINT_LOW("Initiate Input Flush");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002593
Arun Menon906de572013-06-18 17:01:40 -07002594 pthread_mutex_lock(&m_lock);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002595 DEBUG_PRINT_LOW("Check if the Queue is empty");
Arun Menon906de572013-06-18 17:01:40 -07002596 while (m_etb_q.m_size) {
2597 m_etb_q.pop_entry(&p1,&p2,&ident);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002598
Arun Menon906de572013-06-18 17:01:40 -07002599 if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002600 DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
Arun Menon906de572013-06-18 17:01:40 -07002601 m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2602 } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
2603 pending_input_buffers++;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002604 DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
Arun Menon906de572013-06-18 17:01:40 -07002605 (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
2606 empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
2607 } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002608 DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
Arun Menon906de572013-06-18 17:01:40 -07002609 (OMX_BUFFERHEADERTYPE *)p1);
2610 empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2611 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002612 }
Arun Menon906de572013-06-18 17:01:40 -07002613 time_stamp_dts.flush_timestamp();
2614 /*Check if Heap Buffers are to be flushed*/
2615 if (arbitrary_bytes && !(codec_config_flag)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002616 DEBUG_PRINT_LOW("Reset all the variables before flusing");
Arun Menon906de572013-06-18 17:01:40 -07002617 h264_scratch.nFilledLen = 0;
2618 nal_count = 0;
2619 look_ahead_nal = false;
2620 frame_count = 0;
2621 h264_last_au_ts = LLONG_MAX;
2622 h264_last_au_flags = 0;
2623 memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
2624 m_demux_entries = 0;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002625 DEBUG_PRINT_LOW("Initialize parser");
Arun Menon906de572013-06-18 17:01:40 -07002626 if (m_frame_parser.mutils) {
2627 m_frame_parser.mutils->initialize_frame_checking_environment();
2628 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002629
Arun Menon906de572013-06-18 17:01:40 -07002630 while (m_input_pending_q.m_size) {
2631 m_input_pending_q.pop_entry(&p1,&p2,&ident);
2632 m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
2633 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002634
Arun Menon906de572013-06-18 17:01:40 -07002635 if (psource_frame) {
2636 m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
2637 psource_frame = NULL;
2638 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002639
Arun Menon906de572013-06-18 17:01:40 -07002640 if (pdest_frame) {
2641 pdest_frame->nFilledLen = 0;
2642 m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
2643 (unsigned int)NULL);
2644 pdest_frame = NULL;
2645 }
2646 m_frame_parser.flush();
2647 } else if (codec_config_flag) {
2648 DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
2649 "is not sent to the driver yet");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002650 }
Arun Menon906de572013-06-18 17:01:40 -07002651 pthread_mutex_unlock(&m_lock);
2652 input_flush_progress = false;
2653 if (!arbitrary_bytes) {
2654 prev_ts = LLONG_MAX;
2655 rst_prev_ts = true;
2656 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002657#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -07002658 if (m_debug_timestamp) {
2659 m_timestamp_list.reset_ts_list();
2660 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002661#endif
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002662 DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
Arun Menon906de572013-06-18 17:01:40 -07002663 return bRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002664}
2665
2666
2667/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07002668 FUNCTION
2669 omx_vdec::SendCommandEvent
Shalaj Jain273b3e02012-06-22 19:08:03 -07002670
Arun Menon906de572013-06-18 17:01:40 -07002671 DESCRIPTION
2672 Send the event to decoder pipe. This is needed to generate the callbacks
2673 in decoder thread context.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002674
Arun Menon906de572013-06-18 17:01:40 -07002675 PARAMETERS
2676 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002677
Arun Menon906de572013-06-18 17:01:40 -07002678 RETURN VALUE
2679 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07002680
Arun Menon906de572013-06-18 17:01:40 -07002681 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07002682bool omx_vdec::post_event(unsigned int p1,
Arun Menon906de572013-06-18 17:01:40 -07002683 unsigned int p2,
2684 unsigned int id)
Shalaj Jain273b3e02012-06-22 19:08:03 -07002685{
Arun Menon906de572013-06-18 17:01:40 -07002686 bool bRet = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002687
2688
Arun Menon906de572013-06-18 17:01:40 -07002689 pthread_mutex_lock(&m_lock);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002690
Arun Menon906de572013-06-18 17:01:40 -07002691 if (id == m_fill_output_msg ||
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05302692 id == OMX_COMPONENT_GENERATE_FBD ||
2693 id == OMX_COMPONENT_GENERATE_PORT_RECONFIG) {
Arun Menon906de572013-06-18 17:01:40 -07002694 m_ftb_q.insert_entry(p1,p2,id);
2695 } else if (id == OMX_COMPONENT_GENERATE_ETB ||
2696 id == OMX_COMPONENT_GENERATE_EBD ||
2697 id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
2698 m_etb_q.insert_entry(p1,p2,id);
2699 } else {
2700 m_cmd_q.insert_entry(p1,p2,id);
2701 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002702
Arun Menon906de572013-06-18 17:01:40 -07002703 bRet = true;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002704 DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
Arun Menon906de572013-06-18 17:01:40 -07002705 post_message(this, id);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002706
Arun Menon906de572013-06-18 17:01:40 -07002707 pthread_mutex_unlock(&m_lock);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002708
Arun Menon906de572013-06-18 17:01:40 -07002709 return bRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002710}
2711
2712OMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2713{
Arun Menon906de572013-06-18 17:01:40 -07002714 OMX_ERRORTYPE eRet = OMX_ErrorNone;
2715 if (!profileLevelType)
2716 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002717
Arun Menon906de572013-06-18 17:01:40 -07002718 if (profileLevelType->nPortIndex == 0) {
2719 if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
2720 if (profileLevelType->nProfileIndex == 0) {
2721 profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
2722 profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002723
Arun Menon906de572013-06-18 17:01:40 -07002724 } else if (profileLevelType->nProfileIndex == 1) {
2725 profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
2726 profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
2727 } else if (profileLevelType->nProfileIndex == 2) {
2728 profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
2729 profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
2730 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002731 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu",
Arun Menon906de572013-06-18 17:01:40 -07002732 profileLevelType->nProfileIndex);
2733 eRet = OMX_ErrorNoMore;
2734 }
2735 } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
2736 if (profileLevelType->nProfileIndex == 0) {
2737 profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
2738 profileLevelType->eLevel = OMX_VIDEO_H263Level70;
2739 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002740 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
Arun Menon906de572013-06-18 17:01:40 -07002741 eRet = OMX_ErrorNoMore;
2742 }
2743 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
2744 if (profileLevelType->nProfileIndex == 0) {
2745 profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2746 profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5;
2747 } else if (profileLevelType->nProfileIndex == 1) {
2748 profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2749 profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5;
2750 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002751 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
Arun Menon906de572013-06-18 17:01:40 -07002752 eRet = OMX_ErrorNoMore;
2753 }
2754 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
2755 eRet = OMX_ErrorNoMore;
2756 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
2757 if (profileLevelType->nProfileIndex == 0) {
2758 profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
2759 profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL;
2760 } else if (profileLevelType->nProfileIndex == 1) {
2761 profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
2762 profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL;
2763 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002764 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
Arun Menon906de572013-06-18 17:01:40 -07002765 eRet = OMX_ErrorNoMore;
2766 }
2767 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002768 DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind);
Arun Menon906de572013-06-18 17:01:40 -07002769 eRet = OMX_ErrorNoMore;
2770 }
2771 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002772 DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex);
Arun Menon906de572013-06-18 17:01:40 -07002773 eRet = OMX_ErrorBadPortIndex;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002774 }
Arun Menon906de572013-06-18 17:01:40 -07002775 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002776}
2777
2778/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07002779 FUNCTION
2780 omx_vdec::GetParameter
Shalaj Jain273b3e02012-06-22 19:08:03 -07002781
Arun Menon906de572013-06-18 17:01:40 -07002782 DESCRIPTION
2783 OMX Get Parameter method implementation
Shalaj Jain273b3e02012-06-22 19:08:03 -07002784
Arun Menon906de572013-06-18 17:01:40 -07002785 PARAMETERS
2786 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002787
Arun Menon906de572013-06-18 17:01:40 -07002788 RETURN VALUE
2789 Error None if successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07002790
Arun Menon906de572013-06-18 17:01:40 -07002791 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07002792OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07002793 OMX_IN OMX_INDEXTYPE paramIndex,
2794 OMX_INOUT OMX_PTR paramData)
Shalaj Jain273b3e02012-06-22 19:08:03 -07002795{
2796 OMX_ERRORTYPE eRet = OMX_ErrorNone;
2797
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002798 DEBUG_PRINT_LOW("get_parameter:");
Arun Menon906de572013-06-18 17:01:40 -07002799 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002800 DEBUG_PRINT_ERROR("Get Param in Invalid State");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002801 return OMX_ErrorInvalidState;
2802 }
Arun Menon906de572013-06-18 17:01:40 -07002803 if (paramData == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002804 DEBUG_PRINT_LOW("Get Param in Invalid paramData");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002805 return OMX_ErrorBadParameter;
2806 }
Arun Menon906de572013-06-18 17:01:40 -07002807 switch ((unsigned long)paramIndex) {
2808 case OMX_IndexParamPortDefinition: {
2809 OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
2810 (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002811 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
Arun Menon906de572013-06-18 17:01:40 -07002812 eRet = update_portdef(portDefn);
2813 if (eRet == OMX_ErrorNone)
2814 m_port_def = *portDefn;
2815 break;
2816 }
2817 case OMX_IndexParamVideoInit: {
2818 OMX_PORT_PARAM_TYPE *portParamType =
2819 (OMX_PORT_PARAM_TYPE *) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002820 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002821
Arun Menon906de572013-06-18 17:01:40 -07002822 portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2823 portParamType->nSize = sizeof(portParamType);
2824 portParamType->nPorts = 2;
2825 portParamType->nStartPortNumber = 0;
2826 break;
2827 }
2828 case OMX_IndexParamVideoPortFormat: {
2829 OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
2830 (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002831 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002832
Arun Menon906de572013-06-18 17:01:40 -07002833 portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
2834 portFmt->nSize = sizeof(portFmt);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002835
Arun Menon906de572013-06-18 17:01:40 -07002836 if (0 == portFmt->nPortIndex) {
2837 if (0 == portFmt->nIndex) {
2838 portFmt->eColorFormat = OMX_COLOR_FormatUnused;
2839 portFmt->eCompressionFormat = eCompressionFormat;
2840 } else {
2841 DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002842 " NoMore compression formats");
Arun Menon906de572013-06-18 17:01:40 -07002843 eRet = OMX_ErrorNoMore;
2844 }
2845 } else if (1 == portFmt->nPortIndex) {
2846 portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002847
Manikanta Kanamarlapudi78b7fb62014-04-04 11:46:02 -07002848 // Distinguish non-surface mode from normal playback use-case based on
2849 // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2"
2850 // For non-android, use the default list
2851 bool useNonSurfaceMode = false;
2852#if _ANDROID_
2853 useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE);
2854#endif
2855 portFmt->eColorFormat = useNonSurfaceMode ?
2856 getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) :
2857 getPreferredColorFormatDefaultMode(portFmt->nIndex);
2858
2859 if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) {
Praveen Chavandb7776f2014-02-06 18:17:25 -08002860 eRet = OMX_ErrorNoMore;
Arun Menon906de572013-06-18 17:01:40 -07002861 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002862 " NoMore Color formats");
Arun Menon906de572013-06-18 17:01:40 -07002863 }
Praveen Chavandb7776f2014-02-06 18:17:25 -08002864 DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat);
Arun Menon906de572013-06-18 17:01:40 -07002865 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002866 DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
Arun Menon906de572013-06-18 17:01:40 -07002867 (int)portFmt->nPortIndex);
2868 eRet = OMX_ErrorBadPortIndex;
2869 }
2870 break;
2871 }
2872 /*Component should support this port definition*/
2873 case OMX_IndexParamAudioInit: {
2874 OMX_PORT_PARAM_TYPE *audioPortParamType =
2875 (OMX_PORT_PARAM_TYPE *) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002876 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
Arun Menon906de572013-06-18 17:01:40 -07002877 audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2878 audioPortParamType->nSize = sizeof(audioPortParamType);
2879 audioPortParamType->nPorts = 0;
2880 audioPortParamType->nStartPortNumber = 0;
2881 break;
2882 }
2883 /*Component should support this port definition*/
2884 case OMX_IndexParamImageInit: {
2885 OMX_PORT_PARAM_TYPE *imagePortParamType =
2886 (OMX_PORT_PARAM_TYPE *) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002887 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
Arun Menon906de572013-06-18 17:01:40 -07002888 imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2889 imagePortParamType->nSize = sizeof(imagePortParamType);
2890 imagePortParamType->nPorts = 0;
2891 imagePortParamType->nStartPortNumber = 0;
2892 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002893
Arun Menon906de572013-06-18 17:01:40 -07002894 }
2895 /*Component should support this port definition*/
2896 case OMX_IndexParamOtherInit: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002897 DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
Arun Menon906de572013-06-18 17:01:40 -07002898 paramIndex);
2899 eRet =OMX_ErrorUnsupportedIndex;
2900 break;
2901 }
2902 case OMX_IndexParamStandardComponentRole: {
2903 OMX_PARAM_COMPONENTROLETYPE *comp_role;
2904 comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
2905 comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
2906 comp_role->nSize = sizeof(*comp_role);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002907
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002908 DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
Arun Menon906de572013-06-18 17:01:40 -07002909 paramIndex);
2910 strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
2911 OMX_MAX_STRINGNAME_SIZE);
2912 break;
2913 }
2914 /* Added for parameter test */
2915 case OMX_IndexParamPriorityMgmt: {
Shalaj Jain273b3e02012-06-22 19:08:03 -07002916
Arun Menon906de572013-06-18 17:01:40 -07002917 OMX_PRIORITYMGMTTYPE *priorityMgmType =
2918 (OMX_PRIORITYMGMTTYPE *) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002919 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
Arun Menon906de572013-06-18 17:01:40 -07002920 priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
2921 priorityMgmType->nSize = sizeof(priorityMgmType);
Shalaj Jain273b3e02012-06-22 19:08:03 -07002922
Arun Menon906de572013-06-18 17:01:40 -07002923 break;
2924 }
2925 /* Added for parameter test */
2926 case OMX_IndexParamCompBufferSupplier: {
2927 OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
2928 (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002929 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
Shalaj Jain273b3e02012-06-22 19:08:03 -07002930
Arun Menon906de572013-06-18 17:01:40 -07002931 bufferSupplierType->nSize = sizeof(bufferSupplierType);
2932 bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
2933 if (0 == bufferSupplierType->nPortIndex)
2934 bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2935 else if (1 == bufferSupplierType->nPortIndex)
2936 bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2937 else
2938 eRet = OMX_ErrorBadPortIndex;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002939
2940
Arun Menon906de572013-06-18 17:01:40 -07002941 break;
2942 }
2943 case OMX_IndexParamVideoAvc: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002944 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
Arun Menon906de572013-06-18 17:01:40 -07002945 paramIndex);
2946 break;
2947 }
2948 case OMX_IndexParamVideoH263: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002949 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
Arun Menon906de572013-06-18 17:01:40 -07002950 paramIndex);
2951 break;
2952 }
2953 case OMX_IndexParamVideoMpeg4: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002954 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
Arun Menon906de572013-06-18 17:01:40 -07002955 paramIndex);
2956 break;
2957 }
2958 case OMX_IndexParamVideoMpeg2: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002959 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
Arun Menon906de572013-06-18 17:01:40 -07002960 paramIndex);
2961 break;
2962 }
2963 case OMX_IndexParamVideoProfileLevelQuerySupported: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002964 DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
Arun Menon906de572013-06-18 17:01:40 -07002965 OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
2966 (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
2967 eRet = get_supported_profile_level_for_1080p(profileLevelType);
2968 break;
2969 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07002970#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
Arun Menon906de572013-06-18 17:01:40 -07002971 case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002972 DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
Arun Menon906de572013-06-18 17:01:40 -07002973 GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
2974 if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07002975
Arun Menon906de572013-06-18 17:01:40 -07002976 if (secure_mode) {
2977 nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
2978 GRALLOC_USAGE_PRIVATE_UNCACHED);
2979 } else {
2980 nativeBuffersUsage->nUsage =
2981 (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP |
2982 GRALLOC_USAGE_PRIVATE_UNCACHED);
2983 }
2984 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002985 DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
Arun Menon906de572013-06-18 17:01:40 -07002986 eRet = OMX_ErrorBadParameter;
2987 }
2988 }
2989 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07002990#endif
2991
Arun Menon906de572013-06-18 17:01:40 -07002992 default: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002993 DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
Arun Menon906de572013-06-18 17:01:40 -07002994 eRet =OMX_ErrorUnsupportedIndex;
2995 }
2996
Shalaj Jain273b3e02012-06-22 19:08:03 -07002997 }
2998
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07002999 DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
Arun Menon906de572013-06-18 17:01:40 -07003000 drv_ctx.video_resolution.frame_width,
3001 drv_ctx.video_resolution.frame_height,
3002 drv_ctx.video_resolution.stride,
3003 drv_ctx.video_resolution.scan_lines);
Shalaj Jain273b3e02012-06-22 19:08:03 -07003004
Arun Menon906de572013-06-18 17:01:40 -07003005 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003006}
3007
3008#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3009OMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
3010{
3011 DEBUG_PRINT_LOW("Inside use_android_native_buffer");
3012 OMX_ERRORTYPE eRet = OMX_ErrorNone;
3013 UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
3014
Arun Menon906de572013-06-18 17:01:40 -07003015 if ((params == NULL) ||
3016 (params->nativeBuffer == NULL) ||
3017 (params->nativeBuffer->handle == NULL) ||
3018 !m_enable_android_native_buffers)
Shalaj Jain273b3e02012-06-22 19:08:03 -07003019 return OMX_ErrorBadParameter;
3020 m_use_android_native_buffers = OMX_TRUE;
3021 sp<android_native_buffer_t> nBuf = params->nativeBuffer;
3022 private_handle_t *handle = (private_handle_t *)nBuf->handle;
Arun Menon906de572013-06-18 17:01:40 -07003023 if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
Shalaj Jain273b3e02012-06-22 19:08:03 -07003024 OMX_U8 *buffer = NULL;
Arun Menon906de572013-06-18 17:01:40 -07003025 if (!secure_mode) {
3026 buffer = (OMX_U8*)mmap(0, handle->size,
Shalaj Jain273b3e02012-06-22 19:08:03 -07003027 PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
Arun Menon906de572013-06-18 17:01:40 -07003028 if (buffer == MAP_FAILED) {
3029 DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
3030 return OMX_ErrorInsufficientResources;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003031 }
3032 }
3033 eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
3034 } else {
3035 eRet = OMX_ErrorBadParameter;
3036 }
3037 return eRet;
3038}
3039#endif
Praveen Chavancf924182013-12-06 23:16:23 -08003040
3041OMX_ERRORTYPE omx_vdec::enable_smoothstreaming() {
3042 struct v4l2_control control;
3043 struct v4l2_format fmt;
3044 control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
3045 control.value = 1;
3046 int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
3047 if (rc < 0) {
3048 DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3049 return OMX_ErrorHardware;
3050 }
3051 m_smoothstreaming_mode = true;
3052 return OMX_ErrorNone;
3053}
3054
Shalaj Jain273b3e02012-06-22 19:08:03 -07003055/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07003056 FUNCTION
3057 omx_vdec::Setparameter
Shalaj Jain273b3e02012-06-22 19:08:03 -07003058
Arun Menon906de572013-06-18 17:01:40 -07003059 DESCRIPTION
3060 OMX Set Parameter method implementation.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003061
Arun Menon906de572013-06-18 17:01:40 -07003062 PARAMETERS
3063 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003064
Arun Menon906de572013-06-18 17:01:40 -07003065 RETURN VALUE
3066 OMX Error None if successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003067
Arun Menon906de572013-06-18 17:01:40 -07003068 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07003069OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07003070 OMX_IN OMX_INDEXTYPE paramIndex,
3071 OMX_IN OMX_PTR paramData)
Shalaj Jain273b3e02012-06-22 19:08:03 -07003072{
3073 OMX_ERRORTYPE eRet = OMX_ErrorNone;
Praneeth Paladugu226667c2012-09-12 16:42:30 -07003074 int ret=0;
3075 struct v4l2_format fmt;
Arun Menon906de572013-06-18 17:01:40 -07003076 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003077 DEBUG_PRINT_ERROR("Set Param in Invalid State");
Shalaj Jain273b3e02012-06-22 19:08:03 -07003078 return OMX_ErrorInvalidState;
3079 }
Arun Menon906de572013-06-18 17:01:40 -07003080 if (paramData == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003081 DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
Arun Menon906de572013-06-18 17:01:40 -07003082 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003083 }
Arun Menon906de572013-06-18 17:01:40 -07003084 if ((m_state != OMX_StateLoaded) &&
3085 BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
3086 (m_out_bEnabled == OMX_TRUE) &&
3087 BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
3088 (m_inp_bEnabled == OMX_TRUE)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003089 DEBUG_PRINT_ERROR("Set Param in Invalid State");
Shalaj Jain273b3e02012-06-22 19:08:03 -07003090 return OMX_ErrorIncorrectStateOperation;
3091 }
Arun Menon906de572013-06-18 17:01:40 -07003092 switch ((unsigned long)paramIndex) {
3093 case OMX_IndexParamPortDefinition: {
3094 OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
3095 portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
3096 //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
3097 //been called.
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003098 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
Arun Menon906de572013-06-18 17:01:40 -07003099 (int)portDefn->format.video.nFrameHeight,
3100 (int)portDefn->format.video.nFrameWidth);
3101 if (OMX_DirOutput == portDefn->eDir) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003102 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
Pushkaraj Patil41588352014-02-25 20:51:34 +05303103 bool port_format_changed = false;
Arun Menon906de572013-06-18 17:01:40 -07003104 m_display_id = portDefn->format.video.pNativeWindow;
3105 unsigned int buffer_size;
Praveen Chavane78460c2013-12-06 23:16:04 -08003106 /* update output port resolution with client supplied dimensions
3107 in case scaling is enabled, else it follows input resolution set
3108 */
3109 if (is_down_scalar_enabled) {
3110 DEBUG_PRINT_LOW("\n SetParam OP: WxH(%lu x %lu)\n",
Praneeth Paladugu42306bb2013-08-27 22:01:28 -07003111 portDefn->format.video.nFrameWidth,
3112 portDefn->format.video.nFrameHeight);
3113 if (portDefn->format.video.nFrameHeight != 0x0 &&
3114 portDefn->format.video.nFrameWidth != 0x0) {
Pushkaraj Patil41588352014-02-25 20:51:34 +05303115 memset(&fmt, 0x0, sizeof(struct v4l2_format));
3116 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3117 fmt.fmt.pix_mp.pixelformat = capture_capability;
3118 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
3119 if (ret) {
3120 DEBUG_PRINT_ERROR("Get Resolution failed");
3121 eRet = OMX_ErrorHardware;
3122 break;
3123 }
3124 if ((portDefn->format.video.nFrameHeight != (int)fmt.fmt.pix_mp.height) ||
3125 (portDefn->format.video.nFrameWidth != (int)fmt.fmt.pix_mp.width)) {
3126 port_format_changed = true;
3127 }
Praneeth Paladugu42306bb2013-08-27 22:01:28 -07003128 update_resolution(portDefn->format.video.nFrameWidth,
3129 portDefn->format.video.nFrameHeight,
3130 portDefn->format.video.nFrameWidth,
3131 portDefn->format.video.nFrameHeight);
Pushkaraj Patil41588352014-02-25 20:51:34 +05303132
3133 /* set crop info */
3134 rectangle.nLeft = 0;
3135 rectangle.nTop = 0;
3136 rectangle.nWidth = portDefn->format.video.nFrameWidth;
3137 rectangle.nHeight = portDefn->format.video.nFrameHeight;
3138
Praneeth Paladugu42306bb2013-08-27 22:01:28 -07003139 eRet = is_video_session_supported();
3140 if (eRet)
3141 break;
Pushkaraj Patil41588352014-02-25 20:51:34 +05303142 memset(&fmt, 0x0, sizeof(struct v4l2_format));
Praneeth Paladugu42306bb2013-08-27 22:01:28 -07003143 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3144 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
3145 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
3146 fmt.fmt.pix_mp.pixelformat = capture_capability;
3147 DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
3148 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
3149 if (ret) {
3150 DEBUG_PRINT_ERROR("\n Set Resolution failed");
3151 eRet = OMX_ErrorUnsupportedSetting;
3152 } else
3153 eRet = get_buffer_req(&drv_ctx.op_buf);
3154 }
Praveen Chavane78460c2013-12-06 23:16:04 -08003155 }
Arun Menon906de572013-06-18 17:01:40 -07003156 if (!client_buffers.get_buffer_req(buffer_size)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003157 DEBUG_PRINT_ERROR("Error in getting buffer requirements");
Arun Menon906de572013-06-18 17:01:40 -07003158 eRet = OMX_ErrorBadParameter;
Pushkaraj Patil41588352014-02-25 20:51:34 +05303159 } else if (!port_format_changed) {
Arun Menon906de572013-06-18 17:01:40 -07003160 if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
3161 portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) {
3162 drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
3163 drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
3164 drv_ctx.extradata_info.count = drv_ctx.op_buf.actualcount;
3165 drv_ctx.extradata_info.size = drv_ctx.extradata_info.count *
3166 drv_ctx.extradata_info.buffer_size;
3167 eRet = set_buffer_req(&drv_ctx.op_buf);
3168 if (eRet == OMX_ErrorNone)
3169 m_port_def = *portDefn;
3170 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003171 DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)",
Arun Menon906de572013-06-18 17:01:40 -07003172 drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
3173 portDefn->nBufferCountActual, portDefn->nBufferSize);
3174 eRet = OMX_ErrorBadParameter;
3175 }
3176 }
3177 } else if (OMX_DirInput == portDefn->eDir) {
Deva Ramasubramanian9ba5d832014-01-03 18:32:50 -08003178 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
Arun Menon906de572013-06-18 17:01:40 -07003179 bool port_format_changed = false;
3180 if ((portDefn->format.video.xFramerate >> 16) > 0 &&
3181 (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
3182 // Frame rate only should be set if this is a "known value" or to
3183 // activate ts prediction logic (arbitrary mode only) sending input
3184 // timestamps with max value (LLONG_MAX).
3185 DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
3186 portDefn->format.video.xFramerate >> 16);
3187 Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
3188 drv_ctx.frame_rate.fps_denominator);
3189 if (!drv_ctx.frame_rate.fps_numerator) {
3190 DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
3191 drv_ctx.frame_rate.fps_numerator = 30;
3192 }
3193 if (drv_ctx.frame_rate.fps_denominator)
3194 drv_ctx.frame_rate.fps_numerator = (int)
3195 drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
3196 drv_ctx.frame_rate.fps_denominator = 1;
3197 frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
3198 drv_ctx.frame_rate.fps_numerator;
3199 DEBUG_PRINT_LOW("set_parameter: frm_int(%lu) fps(%.2f)",
3200 frm_int, drv_ctx.frame_rate.fps_numerator /
3201 (float)drv_ctx.frame_rate.fps_denominator);
Deva Ramasubramanian9ba5d832014-01-03 18:32:50 -08003202
3203 struct v4l2_outputparm oparm;
3204 /*XXX: we're providing timing info as seconds per frame rather than frames
3205 * per second.*/
3206 oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
3207 oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
3208
3209 struct v4l2_streamparm sparm;
3210 sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
3211 sparm.parm.output = oparm;
3212 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
3213 DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected");
3214 eRet = OMX_ErrorHardware;
3215 break;
3216 }
Arun Menon906de572013-06-18 17:01:40 -07003217 }
Deva Ramasubramanian9ba5d832014-01-03 18:32:50 -08003218
Arun Menon906de572013-06-18 17:01:40 -07003219 if (drv_ctx.video_resolution.frame_height !=
3220 portDefn->format.video.nFrameHeight ||
3221 drv_ctx.video_resolution.frame_width !=
3222 portDefn->format.video.nFrameWidth) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003223 DEBUG_PRINT_LOW("SetParam IP: WxH(%lu x %lu)",
Arun Menon906de572013-06-18 17:01:40 -07003224 portDefn->format.video.nFrameWidth,
3225 portDefn->format.video.nFrameHeight);
3226 port_format_changed = true;
Praveen Chavancf924182013-12-06 23:16:23 -08003227 OMX_U32 frameWidth = portDefn->format.video.nFrameWidth;
3228 OMX_U32 frameHeight = portDefn->format.video.nFrameHeight;
3229 if (frameHeight != 0x0 && frameWidth != 0x0) {
3230 if (m_smoothstreaming_mode &&
3231 ((frameWidth * frameHeight) <
3232 (m_smoothstreaming_width * m_smoothstreaming_height))) {
3233 frameWidth = m_smoothstreaming_width;
3234 frameHeight = m_smoothstreaming_height;
3235 DEBUG_PRINT_LOW("NOTE: Setting resolution %lu x %lu for adaptive-playback/smooth-streaming",
3236 frameWidth, frameHeight);
3237 }
3238 update_resolution(frameWidth, frameHeight,
3239 frameWidth, frameHeight);
Arun Menon906de572013-06-18 17:01:40 -07003240 eRet = is_video_session_supported();
3241 if (eRet)
3242 break;
Pushkaraj Patil41588352014-02-25 20:51:34 +05303243 memset(&fmt, 0x0, sizeof(struct v4l2_format));
Arun Menon906de572013-06-18 17:01:40 -07003244 fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
3245 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
3246 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
3247 fmt.fmt.pix_mp.pixelformat = output_capability;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003248 DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
Arun Menon906de572013-06-18 17:01:40 -07003249 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
3250 if (ret) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003251 DEBUG_PRINT_ERROR("Set Resolution failed");
Arun Menon906de572013-06-18 17:01:40 -07003252 eRet = OMX_ErrorUnsupportedSetting;
Pushkaraj Patil41588352014-02-25 20:51:34 +05303253 } else {
3254 if (!is_down_scalar_enabled)
3255 eRet = get_buffer_req(&drv_ctx.op_buf);
3256 }
Arun Menon906de572013-06-18 17:01:40 -07003257 }
3258 }
Pushkaraj Patil8d273cb2014-07-21 10:43:22 +05303259 if (m_custom_buffersize.input_buffersize
3260 && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) {
3261 DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d",
3262 m_custom_buffersize.input_buffersize, portDefn->nBufferSize);
3263 eRet = OMX_ErrorBadParameter;
3264 break;
3265 }
Arun Menon906de572013-06-18 17:01:40 -07003266 if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
3267 || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
3268 port_format_changed = true;
3269 vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
3270 drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
3271 drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
3272 (~(buffer_prop->alignment - 1));
3273 eRet = set_buffer_req(buffer_prop);
3274 }
3275 if (false == port_format_changed) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003276 DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)",
Arun Menon906de572013-06-18 17:01:40 -07003277 drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
3278 portDefn->nBufferCountActual, portDefn->nBufferSize);
3279 eRet = OMX_ErrorBadParameter;
3280 }
3281 } else if (portDefn->eDir == OMX_DirMax) {
3282 DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
3283 (int)portDefn->nPortIndex);
3284 eRet = OMX_ErrorBadPortIndex;
3285 }
3286 }
3287 break;
3288 case OMX_IndexParamVideoPortFormat: {
3289 OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
3290 (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
3291 int ret=0;
3292 struct v4l2_format fmt;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003293 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
Arun Menon906de572013-06-18 17:01:40 -07003294 portFmt->eColorFormat);
Shalaj Jain273b3e02012-06-22 19:08:03 -07003295
Arun Menon906de572013-06-18 17:01:40 -07003296 if (1 == portFmt->nPortIndex) {
3297 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3298 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
3299 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
3300 fmt.fmt.pix_mp.pixelformat = capture_capability;
3301 enum vdec_output_fromat op_format;
3302 if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
3303 QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
Praveen Chavandb7776f2014-02-06 18:17:25 -08003304 (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar) ||
3305 (portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar))
Arun Menon906de572013-06-18 17:01:40 -07003306 op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
Arun Menon906de572013-06-18 17:01:40 -07003307 else
3308 eRet = OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003309
Arun Menon906de572013-06-18 17:01:40 -07003310 if (eRet == OMX_ErrorNone) {
3311 drv_ctx.output_format = op_format;
3312 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
3313 if (ret) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003314 DEBUG_PRINT_ERROR("Set output format failed");
Arun Menon906de572013-06-18 17:01:40 -07003315 eRet = OMX_ErrorUnsupportedSetting;
3316 /*TODO: How to handle this case */
3317 } else {
3318 eRet = get_buffer_req(&drv_ctx.op_buf);
3319 }
3320 }
3321 if (eRet == OMX_ErrorNone) {
3322 if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003323 DEBUG_PRINT_ERROR("Set color format failed");
Arun Menon906de572013-06-18 17:01:40 -07003324 eRet = OMX_ErrorBadParameter;
3325 }
3326 }
3327 }
3328 }
3329 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003330
Arun Menon906de572013-06-18 17:01:40 -07003331 case OMX_QcomIndexPortDefn: {
3332 OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
3333 (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003334 DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %lu",
Arun Menon906de572013-06-18 17:01:40 -07003335 portFmt->nFramePackingFormat);
Shalaj Jain273b3e02012-06-22 19:08:03 -07003336
Arun Menon906de572013-06-18 17:01:40 -07003337 /* Input port */
3338 if (portFmt->nPortIndex == 0) {
3339 if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
3340 if (secure_mode) {
3341 arbitrary_bytes = false;
3342 DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
3343 eRet = OMX_ErrorUnsupportedSetting;
3344 } else {
3345 arbitrary_bytes = true;
3346 }
3347 } else if (portFmt->nFramePackingFormat ==
3348 OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
3349 arbitrary_bytes = false;
3350 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003351 DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu",
Arun Menon906de572013-06-18 17:01:40 -07003352 portFmt->nFramePackingFormat);
3353 eRet = OMX_ErrorUnsupportedSetting;
3354 }
3355 } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003356 DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
Arun Menon906de572013-06-18 17:01:40 -07003357 if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
3358 portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
3359 portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
3360 m_out_mem_region_smi = OMX_TRUE;
3361 if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003362 DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
Arun Menon906de572013-06-18 17:01:40 -07003363 m_use_output_pmem = OMX_TRUE;
3364 }
3365 }
3366 }
3367 }
3368 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003369
Arun Menon906de572013-06-18 17:01:40 -07003370 case OMX_IndexParamStandardComponentRole: {
3371 OMX_PARAM_COMPONENTROLETYPE *comp_role;
3372 comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003373 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
Arun Menon906de572013-06-18 17:01:40 -07003374 comp_role->cRole);
Shalaj Jain273b3e02012-06-22 19:08:03 -07003375
Arun Menon906de572013-06-18 17:01:40 -07003376 if ((m_state == OMX_StateLoaded)&&
3377 !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
3378 DEBUG_PRINT_LOW("Set Parameter called in valid state");
3379 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003380 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
Arun Menon906de572013-06-18 17:01:40 -07003381 return OMX_ErrorIncorrectStateOperation;
3382 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07003383
Arun Menon906de572013-06-18 17:01:40 -07003384 if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
3385 if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
3386 strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
3387 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003388 DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
Arun Menon906de572013-06-18 17:01:40 -07003389 eRet =OMX_ErrorUnsupportedSetting;
3390 }
3391 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
3392 if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
3393 strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
3394 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003395 DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
Arun Menon906de572013-06-18 17:01:40 -07003396 eRet = OMX_ErrorUnsupportedSetting;
3397 }
3398 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
3399 if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
3400 strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
3401 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003402 DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
Arun Menon906de572013-06-18 17:01:40 -07003403 eRet =OMX_ErrorUnsupportedSetting;
3404 }
3405 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
3406 if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
3407 strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
3408 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003409 DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
Arun Menon906de572013-06-18 17:01:40 -07003410 eRet = OMX_ErrorUnsupportedSetting;
3411 }
3412 } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
Deva Ramasubramanianba4534b2013-12-17 15:52:37 -08003413 (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) ||
3414 (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE))
Arun Menon906de572013-06-18 17:01:40 -07003415 ) {
3416 if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
3417 strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
3418 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003419 DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
Arun Menon906de572013-06-18 17:01:40 -07003420 eRet =OMX_ErrorUnsupportedSetting;
3421 }
3422 } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
3423 (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
3424 ) {
3425 if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
3426 strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
3427 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003428 DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
Arun Menon906de572013-06-18 17:01:40 -07003429 eRet =OMX_ErrorUnsupportedSetting;
3430 }
3431 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
3432 if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
3433 (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
3434 strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
3435 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003436 DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
Arun Menon906de572013-06-18 17:01:40 -07003437 eRet = OMX_ErrorUnsupportedSetting;
3438 }
3439 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003440 DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
Arun Menon906de572013-06-18 17:01:40 -07003441 eRet = OMX_ErrorInvalidComponentName;
3442 }
3443 break;
3444 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07003445
Arun Menon906de572013-06-18 17:01:40 -07003446 case OMX_IndexParamPriorityMgmt: {
3447 if (m_state != OMX_StateLoaded) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003448 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
Arun Menon906de572013-06-18 17:01:40 -07003449 return OMX_ErrorIncorrectStateOperation;
3450 }
3451 OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003452 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %lu",
Arun Menon906de572013-06-18 17:01:40 -07003453 priorityMgmtype->nGroupID);
Shalaj Jain273b3e02012-06-22 19:08:03 -07003454
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003455 DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %lu",
Arun Menon906de572013-06-18 17:01:40 -07003456 priorityMgmtype->nGroupPriority);
Shalaj Jain273b3e02012-06-22 19:08:03 -07003457
Arun Menon906de572013-06-18 17:01:40 -07003458 m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
3459 m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003460
Arun Menon906de572013-06-18 17:01:40 -07003461 break;
3462 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07003463
Arun Menon906de572013-06-18 17:01:40 -07003464 case OMX_IndexParamCompBufferSupplier: {
3465 OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003466 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
Arun Menon906de572013-06-18 17:01:40 -07003467 bufferSupplierType->eBufferSupplier);
3468 if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
3469 m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003470
Arun Menon906de572013-06-18 17:01:40 -07003471 else
Shalaj Jain273b3e02012-06-22 19:08:03 -07003472
Arun Menon906de572013-06-18 17:01:40 -07003473 eRet = OMX_ErrorBadPortIndex;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003474
Arun Menon906de572013-06-18 17:01:40 -07003475 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003476
Arun Menon906de572013-06-18 17:01:40 -07003477 }
3478 case OMX_IndexParamVideoAvc: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003479 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
Arun Menon906de572013-06-18 17:01:40 -07003480 paramIndex);
3481 break;
3482 }
3483 case OMX_IndexParamVideoH263: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003484 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
Arun Menon906de572013-06-18 17:01:40 -07003485 paramIndex);
3486 break;
3487 }
3488 case OMX_IndexParamVideoMpeg4: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003489 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
Arun Menon906de572013-06-18 17:01:40 -07003490 paramIndex);
3491 break;
3492 }
3493 case OMX_IndexParamVideoMpeg2: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003494 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
Arun Menon906de572013-06-18 17:01:40 -07003495 paramIndex);
3496 break;
3497 }
3498 case OMX_QcomIndexParamVideoDecoderPictureOrder: {
3499 QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
3500 (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
3501 struct v4l2_control control;
3502 int pic_order,rc=0;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003503 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
Arun Menon906de572013-06-18 17:01:40 -07003504 pictureOrder->eOutputPictureOrder);
3505 if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
3506 pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
3507 } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
3508 pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
3509 time_stamp_dts.set_timestamp_reorder_mode(false);
3510 } else
3511 eRet = OMX_ErrorBadParameter;
3512 if (eRet == OMX_ErrorNone) {
3513 control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
3514 control.value = pic_order;
3515 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
3516 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003517 DEBUG_PRINT_ERROR("Set picture order failed");
Arun Menon906de572013-06-18 17:01:40 -07003518 eRet = OMX_ErrorUnsupportedSetting;
3519 }
3520 }
3521 break;
3522 }
3523 case OMX_QcomIndexParamConcealMBMapExtraData:
Srinu Gorle2eb94e42014-02-14 13:37:40 +05303524 eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
3525 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3526 break;
3527 case OMX_QcomIndexParamFrameInfoExtraData:
3528 eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
3529 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3530 break;
Arun Menon906de572013-06-18 17:01:40 -07003531 case OMX_QcomIndexParamInterlaceExtraData:
Srinu Gorle2eb94e42014-02-14 13:37:40 +05303532 eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
3533 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3534 break;
Arun Menon906de572013-06-18 17:01:40 -07003535 case OMX_QcomIndexParamH264TimeInfo:
Srinu Gorle2eb94e42014-02-14 13:37:40 +05303536 eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
3537 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3538 break;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05303539 case OMX_QcomIndexParamVideoFramePackingExtradata:
Srinu Gorle2eb94e42014-02-14 13:37:40 +05303540 eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false,
3541 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3542 break;
3543 case OMX_QcomIndexParamVideoQPExtraData:
3544 eRet = enable_extradata(OMX_QP_EXTRADATA, false,
3545 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3546 break;
3547 case OMX_QcomIndexParamVideoInputBitsInfoExtraData:
3548 eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false,
3549 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3550 break;
Pushkaraj Patil74b2eaf2014-06-13 17:07:50 +05303551 case OMX_QcomIndexEnableExtnUserData:
3552 eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false,
3553 ((QOMX_ENABLETYPE *)paramData)->bEnable);
3554 break;
Arun Menon906de572013-06-18 17:01:40 -07003555 case OMX_QcomIndexParamVideoDivx: {
3556 QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
3557 }
3558 break;
3559 case OMX_QcomIndexPlatformPvt: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003560 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
Arun Menon906de572013-06-18 17:01:40 -07003561 OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
3562 if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
3563 DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
3564 eRet = OMX_ErrorUnsupportedSetting;
3565 } else {
3566 m_out_pvt_entry_pmem = OMX_TRUE;
3567 if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003568 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
Arun Menon906de572013-06-18 17:01:40 -07003569 m_use_output_pmem = OMX_TRUE;
3570 }
3571 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07003572
Arun Menon906de572013-06-18 17:01:40 -07003573 }
3574 break;
3575 case OMX_QcomIndexParamVideoSyncFrameDecodingMode: {
3576 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
3577 DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
3578 struct v4l2_control control;
3579 int rc;
3580 drv_ctx.idr_only_decoding = 1;
3581 control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
3582 control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
3583 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
3584 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003585 DEBUG_PRINT_ERROR("Set picture order failed");
Arun Menon906de572013-06-18 17:01:40 -07003586 eRet = OMX_ErrorUnsupportedSetting;
3587 } else {
3588 control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
3589 control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
3590 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
3591 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003592 DEBUG_PRINT_ERROR("Sync frame setting failed");
Arun Menon906de572013-06-18 17:01:40 -07003593 eRet = OMX_ErrorUnsupportedSetting;
3594 }
3595 /*Setting sync frame decoding on driver might change buffer
3596 * requirements so update them here*/
3597 if (get_buffer_req(&drv_ctx.ip_buf)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003598 DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements");
Arun Menon906de572013-06-18 17:01:40 -07003599 eRet = OMX_ErrorUnsupportedSetting;
3600 }
3601 if (get_buffer_req(&drv_ctx.op_buf)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003602 DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements");
Arun Menon906de572013-06-18 17:01:40 -07003603 eRet = OMX_ErrorUnsupportedSetting;
3604 }
3605 }
3606 }
3607 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003608
Arun Menon906de572013-06-18 17:01:40 -07003609 case OMX_QcomIndexParamIndexExtraDataType: {
Srinu Gorle2eb94e42014-02-14 13:37:40 +05303610 QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
3611 if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
3612 (extradataIndexType->bEnabled == OMX_TRUE) &&
3613 (extradataIndexType->nPortIndex == 1)) {
3614 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
3615 eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
3616 }
3617 }
Arun Menon906de572013-06-18 17:01:40 -07003618 break;
3619 case OMX_QcomIndexParamEnableSmoothStreaming: {
Arun Menonc821d8a2013-06-15 10:03:29 -07003620#ifndef SMOOTH_STREAMING_DISABLED
Praveen Chavancf924182013-12-06 23:16:23 -08003621 eRet = enable_smoothstreaming();
Arun Menonbc0922f2013-06-24 13:02:15 -07003622#else
Arun Menon906de572013-06-18 17:01:40 -07003623 eRet = OMX_ErrorUnsupportedSetting;
Arun Menonc821d8a2013-06-15 10:03:29 -07003624#endif
Arun Menon906de572013-06-18 17:01:40 -07003625 }
3626 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003627#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
Arun Menon906de572013-06-18 17:01:40 -07003628 /* Need to allow following two set_parameters even in Idle
3629 * state. This is ANDROID architecture which is not in sync
3630 * with openmax standard. */
3631 case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: {
3632 EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
3633 if (enableNativeBuffers) {
3634 m_enable_android_native_buffers = enableNativeBuffers->enable;
Manikanta Kanamarlapudi78b7fb62014-04-04 11:46:02 -07003635 }
3636 if (m_enable_android_native_buffers) {
3637 // Use the most-preferred-native-color-format as surface-mode is hinted here
3638 if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) {
3639 DEBUG_PRINT_ERROR("Failed to set native color format!");
3640 eRet = OMX_ErrorUnsupportedSetting;
3641 }
Arun Menon906de572013-06-18 17:01:40 -07003642 }
3643 }
3644 break;
3645 case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: {
3646 eRet = use_android_native_buffer(hComp, paramData);
3647 }
3648 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003649#endif
Arun Menon906de572013-06-18 17:01:40 -07003650 case OMX_QcomIndexParamEnableTimeStampReorder: {
3651 QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
3652 if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
3653 if (reorder->bEnable == OMX_TRUE) {
3654 frm_int =0;
3655 time_stamp_dts.set_timestamp_reorder_mode(true);
3656 } else
3657 time_stamp_dts.set_timestamp_reorder_mode(false);
3658 } else {
3659 time_stamp_dts.set_timestamp_reorder_mode(false);
3660 if (reorder->bEnable == OMX_TRUE) {
3661 eRet = OMX_ErrorUnsupportedSetting;
3662 }
3663 }
3664 }
3665 break;
3666 case OMX_IndexParamVideoProfileLevelCurrent: {
3667 OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
3668 (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
3669 if (pParam) {
3670 m_profile_lvl.eProfile = pParam->eProfile;
3671 m_profile_lvl.eLevel = pParam->eLevel;
3672 }
3673 break;
Arun Menon888aa852013-05-30 11:24:42 -07003674
Arun Menon906de572013-06-18 17:01:40 -07003675 }
Arun Menone5652482013-08-04 13:33:05 -07003676 case OMX_QcomIndexParamVideoMetaBufferMode:
3677 {
3678 StoreMetaDataInBuffersParams *metabuffer =
3679 (StoreMetaDataInBuffersParams *)paramData;
3680 if (!metabuffer) {
3681 DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer);
3682 eRet = OMX_ErrorBadParameter;
3683 break;
3684 }
3685 if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
3686 //set property dynamic buffer mode to driver.
3687 struct v4l2_control control;
3688 struct v4l2_format fmt;
3689 control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT;
3690 if (metabuffer->bStoreMetaData == true) {
3691 control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC;
3692 } else {
3693 control.value = V4L2_MPEG_VIDC_VIDEO_STATIC;
3694 }
3695 int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
3696 if (!rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003697 DEBUG_PRINT_HIGH("%s buffer mode",
Arun Menone5652482013-08-04 13:33:05 -07003698 (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic");
Arun Menonbdb80b02013-08-12 17:45:54 -07003699 dynamic_buf_mode = metabuffer->bStoreMetaData;
Arun Menone5652482013-08-04 13:33:05 -07003700 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003701 DEBUG_PRINT_ERROR("Failed to %s buffer mode",
Arun Menone5652482013-08-04 13:33:05 -07003702 (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic");
3703 eRet = OMX_ErrorUnsupportedSetting;
3704 }
3705 } else {
3706 DEBUG_PRINT_ERROR(
Praveen Chavancf924182013-12-06 23:16:23 -08003707 "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %lu",
Arun Menone5652482013-08-04 13:33:05 -07003708 metabuffer->nPortIndex);
3709 eRet = OMX_ErrorUnsupportedSetting;
3710 }
3711 break;
3712 }
Praneeth Paladugu42306bb2013-08-27 22:01:28 -07003713 case OMX_QcomIndexParamVideoDownScalar: {
3714 QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData;
3715 struct v4l2_control control;
3716 int rc;
3717 if (pParam) {
3718 is_down_scalar_enabled = pParam->bEnable;
3719 if (is_down_scalar_enabled) {
3720 control.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE;
3721 control.value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY;
3722 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar value = %d\n",
3723 pParam->bEnable);
3724 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
3725 if (rc < 0) {
3726 DEBUG_PRINT_ERROR("Failed to set down scalar on driver.");
3727 eRet = OMX_ErrorUnsupportedSetting;
3728 }
3729 control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO;
3730 control.value = 1;
3731 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
3732 if (rc < 0) {
3733 DEBUG_PRINT_ERROR("Failed to set keep aspect ratio on driver.");
3734 eRet = OMX_ErrorUnsupportedSetting;
3735 }
3736 }
3737 }
3738 break;
3739 }
Praveen Chavancf924182013-12-06 23:16:23 -08003740#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
3741 case OMX_QcomIndexParamVideoAdaptivePlaybackMode:
3742 {
3743 DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback");
3744 PrepareForAdaptivePlaybackParams* pParams =
3745 (PrepareForAdaptivePlaybackParams *) paramData;
3746 if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
3747 if (!pParams->bEnable) {
3748 return OMX_ErrorNone;
3749 }
Deepak Vermaa2efdb12013-12-26 12:30:05 +05303750 if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth
3751 || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) {
Praveen Chavancf924182013-12-06 23:16:23 -08003752 DEBUG_PRINT_ERROR(
3753 "Adaptive playback request exceeds max supported resolution : [%lu x %lu] vs [%lu x %lu]",
3754 pParams->nMaxFrameWidth, pParams->nMaxFrameHeight,
Deepak Vermaa2efdb12013-12-26 12:30:05 +05303755 maxSmoothStreamingWidth, maxSmoothStreamingHeight);
Praveen Chavancf924182013-12-06 23:16:23 -08003756 eRet = OMX_ErrorBadParameter;
3757 } else {
Arun Menon1fc764f2014-04-17 15:41:27 -07003758 eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight);
3759 }
Praveen Chavancf924182013-12-06 23:16:23 -08003760 } else {
3761 DEBUG_PRINT_ERROR(
3762 "Prepare for adaptive playback supported only on output port");
3763 eRet = OMX_ErrorBadParameter;
3764 }
3765 break;
3766 }
3767
3768#endif
Pushkaraj Patil8d273cb2014-07-21 10:43:22 +05303769 case OMX_QcomIndexParamVideoCustomBufferSize:
3770 {
3771 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize");
3772 QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData;
3773 if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
3774 struct v4l2_control control;
3775 control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT;
3776 control.value = pParam->nBufferSize;
3777 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
3778 DEBUG_PRINT_ERROR("Failed to set input buffer size");
3779 eRet = OMX_ErrorUnsupportedSetting;
3780 } else {
3781 eRet = get_buffer_req(&drv_ctx.ip_buf);
3782 if (eRet == OMX_ErrorNone) {
3783 m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size;
3784 DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d",
3785 m_custom_buffersize.input_buffersize);
3786 } else {
3787 DEBUG_PRINT_ERROR("Failed to get buffer requirement");
3788 }
3789 }
3790 } else {
3791 DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port");
3792 eRet = OMX_ErrorBadParameter;
3793 }
3794 break;
3795 }
Arun Menon906de572013-06-18 17:01:40 -07003796 default: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003797 DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
Arun Menon906de572013-06-18 17:01:40 -07003798 eRet = OMX_ErrorUnsupportedIndex;
3799 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07003800 }
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08003801 if (eRet != OMX_ErrorNone)
3802 DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex);
Arun Menon906de572013-06-18 17:01:40 -07003803 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003804}
3805
3806/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07003807 FUNCTION
3808 omx_vdec::GetConfig
Shalaj Jain273b3e02012-06-22 19:08:03 -07003809
Arun Menon906de572013-06-18 17:01:40 -07003810 DESCRIPTION
3811 OMX Get Config Method implementation.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003812
Arun Menon906de572013-06-18 17:01:40 -07003813 PARAMETERS
3814 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003815
Arun Menon906de572013-06-18 17:01:40 -07003816 RETURN VALUE
3817 OMX Error None if successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003818
Arun Menon906de572013-06-18 17:01:40 -07003819 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07003820OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07003821 OMX_IN OMX_INDEXTYPE configIndex,
3822 OMX_INOUT OMX_PTR configData)
Shalaj Jain273b3e02012-06-22 19:08:03 -07003823{
Arun Menon906de572013-06-18 17:01:40 -07003824 OMX_ERRORTYPE eRet = OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07003825
Arun Menon906de572013-06-18 17:01:40 -07003826 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003827 DEBUG_PRINT_ERROR("Get Config in Invalid State");
Shalaj Jain273b3e02012-06-22 19:08:03 -07003828 return OMX_ErrorInvalidState;
3829 }
Arun Menon906de572013-06-18 17:01:40 -07003830
3831 switch ((unsigned long)configIndex) {
3832 case OMX_QcomIndexConfigInterlaced: {
3833 OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
3834 (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
3835 if (configFmt->nPortIndex == 1) {
3836 if (configFmt->nIndex == 0) {
3837 configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
3838 } else if (configFmt->nIndex == 1) {
3839 configFmt->eInterlaceType =
3840 OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
3841 } else if (configFmt->nIndex == 2) {
3842 configFmt->eInterlaceType =
3843 OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
3844 } else {
3845 DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003846 " NoMore Interlaced formats");
Arun Menon906de572013-06-18 17:01:40 -07003847 eRet = OMX_ErrorNoMore;
3848 }
3849
3850 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003851 DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
Arun Menon906de572013-06-18 17:01:40 -07003852 (int)configFmt->nPortIndex);
3853 eRet = OMX_ErrorBadPortIndex;
3854 }
3855 break;
3856 }
3857 case OMX_QcomIndexQueryNumberOfVideoDecInstance: {
3858 QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
3859 (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
3860 decoderinstances->nNumOfInstances = 16;
3861 /*TODO: How to handle this case */
3862 break;
3863 }
3864 case OMX_QcomIndexConfigVideoFramePackingArrangement: {
3865 if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
3866 OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
3867 (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05303868 memcpy(configFmt, &m_frame_pack_arrangement,
3869 sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
Arun Menon906de572013-06-18 17:01:40 -07003870 } else {
3871 DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
3872 }
3873 break;
3874 }
3875 case OMX_IndexConfigCommonOutputCrop: {
3876 OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
3877 memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05303878 DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u",
3879 rectangle.nLeft, rectangle.nTop,
3880 rectangle.nWidth, rectangle.nHeight);
Arun Menon906de572013-06-18 17:01:40 -07003881 break;
3882 }
3883 default: {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003884 DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
Arun Menon906de572013-06-18 17:01:40 -07003885 eRet = OMX_ErrorBadParameter;
3886 }
3887
Shalaj Jain273b3e02012-06-22 19:08:03 -07003888 }
Arun Menon906de572013-06-18 17:01:40 -07003889
3890 return eRet;
3891}
3892
3893/* ======================================================================
3894 FUNCTION
3895 omx_vdec::SetConfig
3896
3897 DESCRIPTION
3898 OMX Set Config method implementation
3899
3900 PARAMETERS
3901 <TBD>.
3902
3903 RETURN VALUE
3904 OMX Error None if successful.
3905 ========================================================================== */
3906OMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp,
3907 OMX_IN OMX_INDEXTYPE configIndex,
3908 OMX_IN OMX_PTR configData)
3909{
3910 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003911 DEBUG_PRINT_ERROR("Get Config in Invalid State");
Arun Menon906de572013-06-18 17:01:40 -07003912 return OMX_ErrorInvalidState;
3913 }
3914
3915 OMX_ERRORTYPE ret = OMX_ErrorNone;
3916 OMX_VIDEO_CONFIG_NALSIZE *pNal;
3917
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003918 DEBUG_PRINT_LOW("Set Config Called");
Arun Menon906de572013-06-18 17:01:40 -07003919
3920 if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
3921 OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003922 DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called");
Arun Menon906de572013-06-18 17:01:40 -07003923 if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003924 DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC");
Arun Menon906de572013-06-18 17:01:40 -07003925 OMX_U32 extra_size;
3926 // Parsing done here for the AVC atom is definitely not generic
3927 // Currently this piece of code is working, but certainly
3928 // not tested with all .mp4 files.
3929 // Incase of failure, we might need to revisit this
3930 // for a generic piece of code.
3931
3932 // Retrieve size of NAL length field
3933 // byte #4 contains the size of NAL lenght field
3934 nal_length = (config->pData[4] & 0x03) + 1;
3935
3936 extra_size = 0;
3937 if (nal_length > 2) {
3938 /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
3939 extra_size = (nal_length - 2) * 2;
3940 }
3941
3942 // SPS starts from byte #6
3943 OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
3944 OMX_U8 *pDestBuf;
3945 m_vendor_config.nPortIndex = config->nPortIndex;
3946
3947 // minus 6 --> SPS starts from byte #6
3948 // minus 1 --> picture param set byte to be ignored from avcatom
3949 m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
3950 m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
3951 OMX_U32 len;
3952 OMX_U8 index = 0;
3953 // case where SPS+PPS is sent as part of set_config
3954 pDestBuf = m_vendor_config.pData;
3955
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003956 DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%lu] len[%lu] data[%p]",
Arun Menon906de572013-06-18 17:01:40 -07003957 m_vendor_config.nPortIndex,
3958 m_vendor_config.nDataSize,
3959 m_vendor_config.pData);
3960 while (index < 2) {
3961 uint8 *psize;
3962 len = *pSrcBuf;
3963 len = len << 8;
3964 len |= *(pSrcBuf + 1);
3965 psize = (uint8 *) & len;
3966 memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
3967 for (unsigned int i = 0; i < nal_length; i++) {
3968 pDestBuf[i] = psize[nal_length - 1 - i];
3969 }
3970 //memcpy(pDestBuf,pSrcBuf,(len+2));
3971 pDestBuf += len + nal_length;
3972 pSrcBuf += len + 2;
3973 index++;
3974 pSrcBuf++; // skip picture param set
3975 len = 0;
3976 }
3977 } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
3978 !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
3979 m_vendor_config.nPortIndex = config->nPortIndex;
3980 m_vendor_config.nDataSize = config->nDataSize;
3981 m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
3982 memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
3983 } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
3984 if (m_vendor_config.pData) {
3985 free(m_vendor_config.pData);
3986 m_vendor_config.pData = NULL;
3987 m_vendor_config.nDataSize = 0;
3988 }
3989
3990 if (((*((OMX_U32 *) config->pData)) &
3991 VC1_SP_MP_START_CODE_MASK) ==
3992 VC1_SP_MP_START_CODE) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07003993 DEBUG_PRINT_LOW("set_config - VC1 simple/main profile");
Arun Menon906de572013-06-18 17:01:40 -07003994 m_vendor_config.nPortIndex = config->nPortIndex;
3995 m_vendor_config.nDataSize = config->nDataSize;
3996 m_vendor_config.pData =
3997 (OMX_U8 *) malloc(config->nDataSize);
3998 memcpy(m_vendor_config.pData, config->pData,
3999 config->nDataSize);
4000 m_vc1_profile = VC1_SP_MP_RCV;
4001 } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004002 DEBUG_PRINT_LOW("set_config - VC1 Advance profile");
Arun Menon906de572013-06-18 17:01:40 -07004003 m_vendor_config.nPortIndex = config->nPortIndex;
4004 m_vendor_config.nDataSize = config->nDataSize;
4005 m_vendor_config.pData =
4006 (OMX_U8 *) malloc((config->nDataSize));
4007 memcpy(m_vendor_config.pData, config->pData,
4008 config->nDataSize);
4009 m_vc1_profile = VC1_AP;
4010 } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004011 DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only");
Arun Menon906de572013-06-18 17:01:40 -07004012 m_vendor_config.nPortIndex = config->nPortIndex;
4013 m_vendor_config.nDataSize = config->nDataSize;
4014 m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
4015 memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
4016 m_vc1_profile = VC1_SP_MP_RCV;
4017 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004018 DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile");
Arun Menon906de572013-06-18 17:01:40 -07004019 }
4020 }
4021 return ret;
4022 } else if (configIndex == OMX_IndexConfigVideoNalSize) {
4023 struct v4l2_control temp;
4024 temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
4025
4026 pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
4027 switch (pNal->nNaluBytes) {
4028 case 0:
4029 temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
4030 break;
4031 case 2:
4032 temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
4033 break;
4034 case 4:
4035 temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
4036 break;
4037 default:
4038 return OMX_ErrorUnsupportedSetting;
4039 }
4040
4041 if (!arbitrary_bytes) {
4042 /* In arbitrary bytes mode, the assembler strips out nal size and replaces
4043 * with start code, so only need to notify driver in frame by frame mode */
4044 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) {
4045 DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
4046 return OMX_ErrorHardware;
4047 }
4048 }
4049
4050 nal_length = pNal->nNaluBytes;
4051 m_frame_parser.init_nal_length(nal_length);
4052
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004053 DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
Arun Menon906de572013-06-18 17:01:40 -07004054 return ret;
Surajit Podderd2644d52013-08-28 17:59:06 +05304055 } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) {
Arun Menon906de572013-06-18 17:01:40 -07004056 OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
Surajit Podderd2644d52013-08-28 17:59:06 +05304057 DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %lu", config->nFps);
Arun Menon906de572013-06-18 17:01:40 -07004058
4059 if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
4060 if (config->bEnabled) {
4061 if ((config->nFps >> 16) > 0) {
Surajit Podderd2644d52013-08-28 17:59:06 +05304062 DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %lu",
Arun Menon906de572013-06-18 17:01:40 -07004063 config->nFps >> 16);
4064 Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
4065 drv_ctx.frame_rate.fps_denominator);
4066
4067 if (!drv_ctx.frame_rate.fps_numerator) {
4068 DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
4069 drv_ctx.frame_rate.fps_numerator = 30;
4070 }
4071
4072 if (drv_ctx.frame_rate.fps_denominator) {
4073 drv_ctx.frame_rate.fps_numerator = (int)
4074 drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
4075 }
4076
4077 drv_ctx.frame_rate.fps_denominator = 1;
4078 frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
4079 drv_ctx.frame_rate.fps_numerator;
4080
4081 struct v4l2_outputparm oparm;
4082 /*XXX: we're providing timing info as seconds per frame rather than frames
4083 * per second.*/
4084 oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
4085 oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
4086
4087 struct v4l2_streamparm sparm;
4088 sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
4089 sparm.parm.output = oparm;
4090 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
4091 DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
4092 performance might be affected");
4093 ret = OMX_ErrorHardware;
4094 }
4095 client_set_fps = true;
4096 } else {
4097 DEBUG_PRINT_ERROR("Frame rate not supported.");
4098 ret = OMX_ErrorUnsupportedSetting;
4099 }
4100 } else {
4101 DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
4102 client_set_fps = false;
4103 }
4104 } else {
4105 DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
4106 (int)config->nPortIndex);
4107 ret = OMX_ErrorBadPortIndex;
4108 }
4109
4110 return ret;
4111 }
4112
4113 return OMX_ErrorNotImplemented;
4114}
4115
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304116#define extn_equals(param, extn) (!strncmp(param, extn, strlen(extn)))
4117
Arun Menon906de572013-06-18 17:01:40 -07004118/* ======================================================================
4119 FUNCTION
4120 omx_vdec::GetExtensionIndex
4121
4122 DESCRIPTION
4123 OMX GetExtensionIndex method implementaion. <TBD>
4124
4125 PARAMETERS
4126 <TBD>.
4127
4128 RETURN VALUE
4129 OMX Error None if everything successful.
4130
4131 ========================================================================== */
4132OMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
4133 OMX_IN OMX_STRING paramName,
4134 OMX_OUT OMX_INDEXTYPE* indexType)
4135{
4136 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004137 DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
Arun Menon906de572013-06-18 17:01:40 -07004138 return OMX_ErrorInvalidState;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304139 } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) {
Arun Menon906de572013-06-18 17:01:40 -07004140 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304141 } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07004142 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304143 } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) {
4144 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata;
4145 } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) {
4146 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement;
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08004147 } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) {
4148 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData;
Jorge Solano Altamirano54338452014-01-08 11:04:57 -08004149 } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) {
4150 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData;
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08004151 } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) {
4152 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004153 }
4154#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304155 else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07004156 *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304157 } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07004158 *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304159 } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004160 DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004161 *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304162 } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07004163 *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
4164 }
4165#endif
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05304166 else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) {
Arun Menone5652482013-08-04 13:33:05 -07004167 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode;
4168 }
Pushkaraj Patil8f98adf2014-02-12 13:32:00 +05304169#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
Praveen Chavancf924182013-12-06 23:16:23 -08004170 else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) {
4171 *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode;
4172 }
4173#endif
Arun Menon906de572013-06-18 17:01:40 -07004174 else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004175 DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004176 return OMX_ErrorNotImplemented;
4177 }
4178 return OMX_ErrorNone;
4179}
4180
4181/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07004182 FUNCTION
4183 omx_vdec::GetState
Shalaj Jain273b3e02012-06-22 19:08:03 -07004184
Arun Menon906de572013-06-18 17:01:40 -07004185 DESCRIPTION
4186 Returns the state information back to the caller.<TBD>
Shalaj Jain273b3e02012-06-22 19:08:03 -07004187
Arun Menon906de572013-06-18 17:01:40 -07004188 PARAMETERS
4189 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004190
Arun Menon906de572013-06-18 17:01:40 -07004191 RETURN VALUE
4192 Error None if everything is successful.
4193 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07004194OMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07004195 OMX_OUT OMX_STATETYPE* state)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004196{
Arun Menon906de572013-06-18 17:01:40 -07004197 *state = m_state;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004198 DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
Arun Menon906de572013-06-18 17:01:40 -07004199 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004200}
4201
4202/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07004203 FUNCTION
4204 omx_vdec::ComponentTunnelRequest
Shalaj Jain273b3e02012-06-22 19:08:03 -07004205
Arun Menon906de572013-06-18 17:01:40 -07004206 DESCRIPTION
4207 OMX Component Tunnel Request method implementation. <TBD>
Shalaj Jain273b3e02012-06-22 19:08:03 -07004208
Arun Menon906de572013-06-18 17:01:40 -07004209 PARAMETERS
4210 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004211
Arun Menon906de572013-06-18 17:01:40 -07004212 RETURN VALUE
4213 OMX Error None if everything successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004214
Arun Menon906de572013-06-18 17:01:40 -07004215 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07004216OMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07004217 OMX_IN OMX_U32 port,
4218 OMX_IN OMX_HANDLETYPE peerComponent,
4219 OMX_IN OMX_U32 peerPort,
4220 OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004221{
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004222 DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
Arun Menon906de572013-06-18 17:01:40 -07004223 return OMX_ErrorNotImplemented;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004224}
4225
4226/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07004227 FUNCTION
4228 omx_vdec::UseOutputBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07004229
Arun Menon906de572013-06-18 17:01:40 -07004230 DESCRIPTION
4231 Helper function for Use buffer in the input pin
Shalaj Jain273b3e02012-06-22 19:08:03 -07004232
Arun Menon906de572013-06-18 17:01:40 -07004233 PARAMETERS
4234 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004235
Arun Menon906de572013-06-18 17:01:40 -07004236 RETURN VALUE
4237 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07004238
Arun Menon906de572013-06-18 17:01:40 -07004239 ========================================================================== */
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004240OMX_ERRORTYPE omx_vdec::allocate_extradata()
4241{
4242#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07004243 if (drv_ctx.extradata_info.buffer_size) {
4244 if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
4245 munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
4246 close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
4247 free_ion_memory(&drv_ctx.extradata_info.ion);
Praveen Chavan61e5d162013-11-01 02:49:19 -07004248 memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
Arun Menon906de572013-06-18 17:01:40 -07004249 }
4250 drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
4251 drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
4252 drv_ctx.extradata_info.size, 4096,
4253 &drv_ctx.extradata_info.ion.ion_alloc_data,
4254 &drv_ctx.extradata_info.ion.fd_ion_data, 0);
4255 if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004256 DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
Arun Menon906de572013-06-18 17:01:40 -07004257 return OMX_ErrorInsufficientResources;
4258 }
4259 drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
4260 drv_ctx.extradata_info.size,
4261 PROT_READ|PROT_WRITE, MAP_SHARED,
4262 drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
4263 if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004264 DEBUG_PRINT_ERROR("Failed to map extradata memory");
Arun Menon906de572013-06-18 17:01:40 -07004265 close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
4266 free_ion_memory(&drv_ctx.extradata_info.ion);
4267 return OMX_ErrorInsufficientResources;
4268 }
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004269 }
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004270#endif
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05304271 if (!m_other_extradata) {
4272 m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size);
4273 if (!m_other_extradata) {
4274 DEBUG_PRINT_ERROR("Failed to alloc memory\n");
4275 return OMX_ErrorInsufficientResources;
4276 }
4277 }
Arun Menon906de572013-06-18 17:01:40 -07004278 return OMX_ErrorNone;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004279}
4280
Arun Menon906de572013-06-18 17:01:40 -07004281void omx_vdec::free_extradata()
4282{
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004283#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07004284 if (drv_ctx.extradata_info.uaddr) {
4285 munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
4286 close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
4287 free_ion_memory(&drv_ctx.extradata_info.ion);
4288 }
4289 memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004290#endif
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05304291 if (m_other_extradata) {
4292 free(m_other_extradata);
4293 m_other_extradata = NULL;
4294 }
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004295}
4296
Shalaj Jain273b3e02012-06-22 19:08:03 -07004297OMX_ERRORTYPE omx_vdec::use_output_buffer(
Arun Menon906de572013-06-18 17:01:40 -07004298 OMX_IN OMX_HANDLETYPE hComp,
4299 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4300 OMX_IN OMX_U32 port,
4301 OMX_IN OMX_PTR appData,
4302 OMX_IN OMX_U32 bytes,
4303 OMX_IN OMX_U8* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004304{
Arun Menon906de572013-06-18 17:01:40 -07004305 OMX_ERRORTYPE eRet = OMX_ErrorNone;
4306 OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
4307 unsigned i= 0; // Temporary counter
4308 struct vdec_setbuffer_cmd setbuffers;
4309 OMX_PTR privateAppData = NULL;
4310 private_handle_t *handle = NULL;
4311 OMX_U8 *buff = buffer;
4312 struct v4l2_buffer buf;
4313 struct v4l2_plane plane[VIDEO_MAX_PLANES];
4314 int extra_idx = 0;
Deva Ramasubramanian614f79e2012-08-10 21:42:10 -07004315
Arun Menon906de572013-06-18 17:01:40 -07004316 if (!m_out_mem_ptr) {
4317 DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
4318 eRet = allocate_output_headers();
4319 if (eRet == OMX_ErrorNone)
4320 eRet = allocate_extradata();
Shalaj Jain273b3e02012-06-22 19:08:03 -07004321 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004322
Arun Menon906de572013-06-18 17:01:40 -07004323 if (eRet == OMX_ErrorNone) {
4324 for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
4325 if (BITMASK_ABSENT(&m_out_bm_count,i)) {
4326 break;
4327 }
4328 }
4329 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004330
Arun Menon906de572013-06-18 17:01:40 -07004331 if (i >= drv_ctx.op_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004332 DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
Arun Menon906de572013-06-18 17:01:40 -07004333 eRet = OMX_ErrorInsufficientResources;
4334 }
4335
Arun Menonbdb80b02013-08-12 17:45:54 -07004336 if (dynamic_buf_mode) {
4337 *bufferHdr = (m_out_mem_ptr + i );
4338 (*bufferHdr)->pBuffer = NULL;
4339 if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
4340 enum v4l2_buf_type buf_type;
4341 int rr = 0;
4342 buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
4343 if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
4344 DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr);
4345 return OMX_ErrorInsufficientResources;
4346 } else {
4347 streaming[CAPTURE_PORT] = true;
4348 DEBUG_PRINT_LOW("STREAMON Successful");
4349 }
4350 }
4351 BITMASK_SET(&m_out_bm_count,i);
4352 (*bufferHdr)->pAppPrivate = appData;
4353 (*bufferHdr)->pBuffer = buffer;
4354 (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
4355 return eRet;
4356 }
Arun Menon906de572013-06-18 17:01:40 -07004357 if (eRet == OMX_ErrorNone) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07004358#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
Arun Menon906de572013-06-18 17:01:40 -07004359 if (m_enable_android_native_buffers) {
4360 if (m_use_android_native_buffers) {
4361 UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
4362 sp<android_native_buffer_t> nBuf = params->nativeBuffer;
4363 handle = (private_handle_t *)nBuf->handle;
4364 privateAppData = params->pAppPrivate;
4365 } else {
4366 handle = (private_handle_t *)buff;
4367 privateAppData = appData;
4368 }
Arun Menon8544ead2014-05-08 17:42:29 -07004369 if (!handle) {
4370 DEBUG_PRINT_ERROR("handle is invalid");
4371 return OMX_ErrorBadParameter;
4372 }
Deva Ramasubramanian614f79e2012-08-10 21:42:10 -07004373
Arun Menon906de572013-06-18 17:01:40 -07004374 if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
4375 DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
4376 " expected %u, got %lu",
4377 drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
4378 return OMX_ErrorBadParameter;
4379 }
Deva Ramasubramanian614f79e2012-08-10 21:42:10 -07004380
Deva Ramasubramanian03a5bb92014-04-25 19:03:50 -07004381 drv_ctx.op_buf.buffer_size = handle->size;
4382
Arun Menon906de572013-06-18 17:01:40 -07004383 if (!m_use_android_native_buffers) {
4384 if (!secure_mode) {
4385 buff = (OMX_U8*)mmap(0, handle->size,
4386 PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
4387 if (buff == MAP_FAILED) {
4388 DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
4389 return OMX_ErrorInsufficientResources;
4390 }
Deva Ramasubramanian614f79e2012-08-10 21:42:10 -07004391 }
4392 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004393#if defined(_ANDROID_ICS_)
Arun Menon906de572013-06-18 17:01:40 -07004394 native_buffer[i].nativehandle = handle;
4395 native_buffer[i].privatehandle = handle;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004396#endif
Arun Menon906de572013-06-18 17:01:40 -07004397 if (!handle) {
4398 DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
4399 return OMX_ErrorBadParameter;
4400 }
4401 drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
4402 drv_ctx.ptr_outputbuffer[i].offset = 0;
4403 drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4404 drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4405 drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
4406 } else
4407#endif
4408
4409 if (!ouput_egl_buffers && !m_use_output_pmem) {
4410#ifdef USE_ION
4411 drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4412 drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
4413 &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
4414 &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
4415 if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004416 DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
Arun Menon906de572013-06-18 17:01:40 -07004417 return OMX_ErrorInsufficientResources;
4418 }
4419 drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4420 drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
4421#else
4422 drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4423 open (MEM_DEVICE,O_RDWR);
4424
4425 if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004426 DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
Arun Menon906de572013-06-18 17:01:40 -07004427 return OMX_ErrorInsufficientResources;
4428 }
4429
4430 /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
4431 if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
4432 drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4433 open (MEM_DEVICE,O_RDWR);
4434 if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004435 DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
Arun Menon906de572013-06-18 17:01:40 -07004436 return OMX_ErrorInsufficientResources;
4437 }
4438 }
4439
4440 if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
4441 drv_ctx.op_buf.buffer_size,
4442 drv_ctx.op_buf.alignment)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004443 DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
Arun Menon906de572013-06-18 17:01:40 -07004444 close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4445 return OMX_ErrorInsufficientResources;
4446 }
4447#endif
4448 if (!secure_mode) {
4449 drv_ctx.ptr_outputbuffer[i].bufferaddr =
4450 (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
4451 PROT_READ|PROT_WRITE, MAP_SHARED,
4452 drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
4453 if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
4454 close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4455#ifdef USE_ION
4456 free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4457#endif
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004458 DEBUG_PRINT_ERROR("Unable to mmap output buffer");
Arun Menon906de572013-06-18 17:01:40 -07004459 return OMX_ErrorInsufficientResources;
4460 }
4461 }
4462 drv_ctx.ptr_outputbuffer[i].offset = 0;
4463 privateAppData = appData;
4464 } else {
4465
4466 DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
4467 if (!appData || !bytes ) {
4468 if (!secure_mode && !buffer) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004469 DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
Arun Menon906de572013-06-18 17:01:40 -07004470 return OMX_ErrorBadParameter;
4471 }
4472 }
4473
4474 OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
4475 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
4476 pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
Arun Menon8544ead2014-05-08 17:42:29 -07004477 if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry ||
Arun Menon906de572013-06-18 17:01:40 -07004478 !pmem_list->nEntries ||
4479 pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004480 DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
Arun Menon906de572013-06-18 17:01:40 -07004481 return OMX_ErrorBadParameter;
4482 }
4483 pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4484 pmem_list->entryList->entry;
4485 DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
4486 pmem_info->pmem_fd);
4487 drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
4488 drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
4489 drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4490 drv_ctx.ptr_outputbuffer[i].mmaped_size =
4491 drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4492 privateAppData = appData;
4493 }
4494 m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
4495 m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05304496 m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
4497 m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
4498 m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
Arun Menon906de572013-06-18 17:01:40 -07004499
4500 *bufferHdr = (m_out_mem_ptr + i );
4501 if (secure_mode)
4502 drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
4503 //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4504 memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
4505 sizeof (vdec_bufferpayload));
4506
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004507 DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
Arun Menon906de572013-06-18 17:01:40 -07004508 drv_ctx.ptr_outputbuffer[i].bufferaddr,
4509 drv_ctx.ptr_outputbuffer[i].pmem_fd );
4510
4511 buf.index = i;
4512 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
4513 buf.memory = V4L2_MEMORY_USERPTR;
4514 plane[0].length = drv_ctx.op_buf.buffer_size;
4515 plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
4516 (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
4517 plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
4518 plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
4519 plane[0].data_offset = 0;
4520 extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
4521 if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
4522 plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
4523 plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
4524#ifdef USE_ION
4525 plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
4526#endif
4527 plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
4528 plane[extra_idx].data_offset = 0;
4529 } else if (extra_idx >= VIDEO_MAX_PLANES) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004530 DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004531 return OMX_ErrorBadParameter;
4532 }
Arun Menon906de572013-06-18 17:01:40 -07004533 buf.m.planes = plane;
4534 buf.length = drv_ctx.num_planes;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004535
Arun Menon906de572013-06-18 17:01:40 -07004536 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004537 DEBUG_PRINT_ERROR("Failed to prepare bufs");
Arun Menon906de572013-06-18 17:01:40 -07004538 /*TODO: How to handle this case */
Shalaj Jain273b3e02012-06-22 19:08:03 -07004539 return OMX_ErrorInsufficientResources;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004540 }
4541
Arun Menon906de572013-06-18 17:01:40 -07004542 if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
4543 enum v4l2_buf_type buf_type;
4544 buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
4545 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
4546 return OMX_ErrorInsufficientResources;
4547 } else {
4548 streaming[CAPTURE_PORT] = true;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004549 DEBUG_PRINT_LOW("STREAMON Successful");
Shalaj Jain273b3e02012-06-22 19:08:03 -07004550 }
4551 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004552
Arun Menon906de572013-06-18 17:01:40 -07004553 (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
4554 if (m_enable_android_native_buffers) {
4555 DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
4556 (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
4557 } else {
4558 (*bufferHdr)->pBuffer = buff;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004559 }
Arun Menon906de572013-06-18 17:01:40 -07004560 (*bufferHdr)->pAppPrivate = privateAppData;
4561 BITMASK_SET(&m_out_bm_count,i);
4562 }
4563 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004564}
4565
4566/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07004567 FUNCTION
4568 omx_vdec::use_input_heap_buffers
Shalaj Jain273b3e02012-06-22 19:08:03 -07004569
Arun Menon906de572013-06-18 17:01:40 -07004570 DESCRIPTION
4571 OMX Use Buffer Heap allocation method implementation.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004572
Arun Menon906de572013-06-18 17:01:40 -07004573 PARAMETERS
4574 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004575
Arun Menon906de572013-06-18 17:01:40 -07004576 RETURN VALUE
4577 OMX Error None , if everything successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004578
Arun Menon906de572013-06-18 17:01:40 -07004579 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07004580OMX_ERRORTYPE omx_vdec::use_input_heap_buffers(
Arun Menon906de572013-06-18 17:01:40 -07004581 OMX_IN OMX_HANDLETYPE hComp,
4582 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4583 OMX_IN OMX_U32 port,
4584 OMX_IN OMX_PTR appData,
4585 OMX_IN OMX_U32 bytes,
4586 OMX_IN OMX_U8* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004587{
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004588 DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
Arun Menon906de572013-06-18 17:01:40 -07004589 OMX_ERRORTYPE eRet = OMX_ErrorNone;
4590 if (!m_inp_heap_ptr)
4591 m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
4592 calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4593 drv_ctx.ip_buf.actualcount);
4594 if (!m_phdr_pmem_ptr)
4595 m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
4596 calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4597 drv_ctx.ip_buf.actualcount);
4598 if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
4599 DEBUG_PRINT_ERROR("Insufficent memory");
4600 eRet = OMX_ErrorInsufficientResources;
4601 } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
4602 input_use_buffer = true;
4603 memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
4604 m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
4605 m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
4606 m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
4607 m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
4608 m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
4609 *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
4610 eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004611 DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
Arun Menon906de572013-06-18 17:01:40 -07004612 if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
4613 (unsigned)NULL, (unsigned)NULL)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004614 DEBUG_PRINT_ERROR("ERROR:Free_q is full");
Arun Menon906de572013-06-18 17:01:40 -07004615 return OMX_ErrorInsufficientResources;
4616 }
4617 m_in_alloc_cnt++;
4618 } else {
4619 DEBUG_PRINT_ERROR("All i/p buffers have been set!");
4620 eRet = OMX_ErrorInsufficientResources;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004621 }
Arun Menon906de572013-06-18 17:01:40 -07004622 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004623}
4624
4625/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07004626 FUNCTION
4627 omx_vdec::UseBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07004628
Arun Menon906de572013-06-18 17:01:40 -07004629 DESCRIPTION
4630 OMX Use Buffer method implementation.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004631
Arun Menon906de572013-06-18 17:01:40 -07004632 PARAMETERS
4633 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004634
Arun Menon906de572013-06-18 17:01:40 -07004635 RETURN VALUE
4636 OMX Error None , if everything successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004637
Arun Menon906de572013-06-18 17:01:40 -07004638 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07004639OMX_ERRORTYPE omx_vdec::use_buffer(
Arun Menon906de572013-06-18 17:01:40 -07004640 OMX_IN OMX_HANDLETYPE hComp,
4641 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4642 OMX_IN OMX_U32 port,
4643 OMX_IN OMX_PTR appData,
4644 OMX_IN OMX_U32 bytes,
4645 OMX_IN OMX_U8* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004646{
Arun Menon906de572013-06-18 17:01:40 -07004647 OMX_ERRORTYPE error = OMX_ErrorNone;
4648 struct vdec_setbuffer_cmd setbuffers;
4649
Arun Menon8544ead2014-05-08 17:42:29 -07004650 if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) {
4651 DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
4652 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004653 }
Arun Menon906de572013-06-18 17:01:40 -07004654 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004655 DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
Arun Menon906de572013-06-18 17:01:40 -07004656 return OMX_ErrorInvalidState;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004657 }
Arun Menon906de572013-06-18 17:01:40 -07004658 if (port == OMX_CORE_INPUT_PORT_INDEX)
4659 error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
4660 else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
4661 error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
4662 else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004663 DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
Arun Menon906de572013-06-18 17:01:40 -07004664 error = OMX_ErrorBadPortIndex;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004665 }
Arun Menon906de572013-06-18 17:01:40 -07004666 DEBUG_PRINT_LOW("Use Buffer: port %lu, buffer %p, eRet %d", port, *bufferHdr, error);
4667 if (error == OMX_ErrorNone) {
4668 if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
4669 // Send the callback now
4670 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4671 post_event(OMX_CommandStateSet,OMX_StateIdle,
4672 OMX_COMPONENT_GENERATE_EVENT);
4673 }
4674 if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
4675 BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
4676 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4677 post_event(OMX_CommandPortEnable,
4678 OMX_CORE_INPUT_PORT_INDEX,
4679 OMX_COMPONENT_GENERATE_EVENT);
4680 } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
4681 BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
4682 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4683 post_event(OMX_CommandPortEnable,
4684 OMX_CORE_OUTPUT_PORT_INDEX,
4685 OMX_COMPONENT_GENERATE_EVENT);
4686 }
4687 }
4688 return error;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004689}
4690
4691OMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
Arun Menon906de572013-06-18 17:01:40 -07004692 OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004693{
Arun Menon906de572013-06-18 17:01:40 -07004694 if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
4695 if (m_inp_heap_ptr[bufferindex].pBuffer)
4696 free(m_inp_heap_ptr[bufferindex].pBuffer);
4697 m_inp_heap_ptr[bufferindex].pBuffer = NULL;
4698 }
4699 if (pmem_bufferHdr)
4700 free_input_buffer(pmem_bufferHdr);
4701 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004702}
4703
4704OMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4705{
Arun Menon906de572013-06-18 17:01:40 -07004706 unsigned int index = 0;
4707 if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
4708 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004709 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004710
Arun Menon906de572013-06-18 17:01:40 -07004711 index = bufferHdr - m_inp_mem_ptr;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004712 DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
Arun Menon906de572013-06-18 17:01:40 -07004713
4714 if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004715 DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
Arun Menon906de572013-06-18 17:01:40 -07004716 if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
4717 struct vdec_setbuffer_cmd setbuffers;
4718 setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4719 memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
4720 sizeof (vdec_bufferpayload));
4721 if (!secure_mode) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004722 DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
Arun Menon906de572013-06-18 17:01:40 -07004723 drv_ctx.ptr_inputbuffer[index].pmem_fd);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004724 DEBUG_PRINT_LOW("unmap the input buffer size=%d address = %p",
Arun Menon906de572013-06-18 17:01:40 -07004725 drv_ctx.ptr_inputbuffer[index].mmaped_size,
4726 drv_ctx.ptr_inputbuffer[index].bufferaddr);
4727 munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
4728 drv_ctx.ptr_inputbuffer[index].mmaped_size);
4729 }
4730 close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
4731 drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
4732 if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
4733 free(m_desc_buffer_ptr[index].buf_addr);
4734 m_desc_buffer_ptr[index].buf_addr = NULL;
4735 m_desc_buffer_ptr[index].desc_data_size = 0;
4736 }
4737#ifdef USE_ION
4738 free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4739#endif
4740 }
4741 }
4742
4743 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004744}
4745
4746OMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4747{
Arun Menon906de572013-06-18 17:01:40 -07004748 unsigned int index = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004749
Arun Menon906de572013-06-18 17:01:40 -07004750 if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
4751 return OMX_ErrorBadParameter;
4752 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004753
Arun Menon906de572013-06-18 17:01:40 -07004754 index = bufferHdr - m_out_mem_ptr;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004755 DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004756
Arun Menon906de572013-06-18 17:01:40 -07004757 if (index < drv_ctx.op_buf.actualcount
4758 && drv_ctx.ptr_outputbuffer) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004759 DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index,
Arun Menon906de572013-06-18 17:01:40 -07004760 drv_ctx.ptr_outputbuffer[index].bufferaddr);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004761
Arun Menon906de572013-06-18 17:01:40 -07004762 struct vdec_setbuffer_cmd setbuffers;
4763 setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4764 memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
4765 sizeof (vdec_bufferpayload));
Praveen Chavan61e5d162013-11-01 02:49:19 -07004766
4767 if (!dynamic_buf_mode) {
Balamurugan Alagarsamye773c582014-12-17 15:10:25 +05304768 if (streaming[CAPTURE_PORT] &&
4769 !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) {
4770 if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
4771 DEBUG_PRINT_ERROR("STREAMOFF Failed");
4772 } else {
4773 DEBUG_PRINT_LOW("STREAMOFF Successful");
4774 }
4775 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004776#ifdef _ANDROID_
Praveen Chavan61e5d162013-11-01 02:49:19 -07004777 if (m_enable_android_native_buffers) {
Arun Menon906de572013-06-18 17:01:40 -07004778 if (!secure_mode) {
Praveen Chavan61e5d162013-11-01 02:49:19 -07004779 if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
4780 munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
4781 drv_ctx.ptr_outputbuffer[index].mmaped_size);
4782 }
Arun Menon906de572013-06-18 17:01:40 -07004783 }
Praveen Chavan61e5d162013-11-01 02:49:19 -07004784 drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4785 } else {
4786#endif
4787 if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
4788 if (!secure_mode) {
4789 DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
4790 drv_ctx.ptr_outputbuffer[0].pmem_fd);
4791 DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %p",
4792 drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
4793 drv_ctx.ptr_outputbuffer[0].bufferaddr);
4794 munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
4795 drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
4796 }
4797 close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
4798 drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004799#ifdef USE_ION
Praveen Chavan61e5d162013-11-01 02:49:19 -07004800 free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004801#endif
Praveen Chavan61e5d162013-11-01 02:49:19 -07004802 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004803#ifdef _ANDROID_
Praveen Chavan61e5d162013-11-01 02:49:19 -07004804 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004805#endif
Praveen Chavan61e5d162013-11-01 02:49:19 -07004806 } //!dynamic_buf_mode
Arun Menon906de572013-06-18 17:01:40 -07004807 if (release_output_done()) {
4808 free_extradata();
4809 }
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07004810 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004811
Arun Menon906de572013-06-18 17:01:40 -07004812 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004813
4814}
4815
4816OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07004817 OMX_BUFFERHEADERTYPE **bufferHdr,
4818 OMX_U32 port,
4819 OMX_PTR appData,
4820 OMX_U32 bytes)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004821{
Arun Menon906de572013-06-18 17:01:40 -07004822 OMX_BUFFERHEADERTYPE *input = NULL;
4823 unsigned char *buf_addr = NULL;
4824 OMX_ERRORTYPE eRet = OMX_ErrorNone;
4825 unsigned i = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004826
Arun Menon906de572013-06-18 17:01:40 -07004827 /* Sanity Check*/
4828 if (bufferHdr == NULL) {
4829 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004830 }
4831
Arun Menon906de572013-06-18 17:01:40 -07004832 if (m_inp_heap_ptr == NULL) {
4833 m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
4834 calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4835 drv_ctx.ip_buf.actualcount);
4836 m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
4837 calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4838 drv_ctx.ip_buf.actualcount);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004839
Arun Menon8544ead2014-05-08 17:42:29 -07004840 if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) {
4841 DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed ");
Arun Menon906de572013-06-18 17:01:40 -07004842 return OMX_ErrorInsufficientResources;
4843 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004844 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004845
Arun Menon906de572013-06-18 17:01:40 -07004846 /*Find a Free index*/
4847 for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
4848 if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004849 DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
Arun Menon906de572013-06-18 17:01:40 -07004850 break;
4851 }
4852 }
4853
4854 if (i < drv_ctx.ip_buf.actualcount) {
4855 buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
4856
4857 if (buf_addr == NULL) {
4858 return OMX_ErrorInsufficientResources;
4859 }
4860
4861 *bufferHdr = (m_inp_heap_ptr + i);
4862 input = *bufferHdr;
4863 BITMASK_SET(&m_heap_inp_bm_count,i);
4864
4865 input->pBuffer = (OMX_U8 *)buf_addr;
4866 input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
4867 input->nVersion.nVersion = OMX_SPEC_VERSION;
4868 input->nAllocLen = drv_ctx.ip_buf.buffer_size;
4869 input->pAppPrivate = appData;
4870 input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004871 DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
Arun Menon906de572013-06-18 17:01:40 -07004872 eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004873 DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
Arun Menon906de572013-06-18 17:01:40 -07004874 /*Add the Buffers to freeq*/
4875 if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
4876 (unsigned)NULL, (unsigned)NULL)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004877 DEBUG_PRINT_ERROR("ERROR:Free_q is full");
Arun Menon906de572013-06-18 17:01:40 -07004878 return OMX_ErrorInsufficientResources;
4879 }
4880 } else {
4881 return OMX_ErrorBadParameter;
4882 }
4883
4884 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004885
4886}
4887
4888
4889/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07004890 FUNCTION
4891 omx_vdec::AllocateInputBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07004892
Arun Menon906de572013-06-18 17:01:40 -07004893 DESCRIPTION
4894 Helper function for allocate buffer in the input pin
Shalaj Jain273b3e02012-06-22 19:08:03 -07004895
Arun Menon906de572013-06-18 17:01:40 -07004896 PARAMETERS
4897 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07004898
Arun Menon906de572013-06-18 17:01:40 -07004899 RETURN VALUE
4900 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07004901
Arun Menon906de572013-06-18 17:01:40 -07004902 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07004903OMX_ERRORTYPE omx_vdec::allocate_input_buffer(
Arun Menon906de572013-06-18 17:01:40 -07004904 OMX_IN OMX_HANDLETYPE hComp,
4905 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4906 OMX_IN OMX_U32 port,
4907 OMX_IN OMX_PTR appData,
4908 OMX_IN OMX_U32 bytes)
Shalaj Jain273b3e02012-06-22 19:08:03 -07004909{
4910
Arun Menon906de572013-06-18 17:01:40 -07004911 OMX_ERRORTYPE eRet = OMX_ErrorNone;
4912 struct vdec_setbuffer_cmd setbuffers;
4913 OMX_BUFFERHEADERTYPE *input = NULL;
4914 unsigned i = 0;
4915 unsigned char *buf_addr = NULL;
4916 int pmem_fd = -1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004917
Arun Menon906de572013-06-18 17:01:40 -07004918 if (bytes != drv_ctx.ip_buf.buffer_size) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004919 DEBUG_PRINT_LOW("Requested Size is wrong %lu epected is %d",
Arun Menon906de572013-06-18 17:01:40 -07004920 bytes, drv_ctx.ip_buf.buffer_size);
4921 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004922 }
4923
Arun Menon906de572013-06-18 17:01:40 -07004924 if (!m_inp_mem_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004925 DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
Arun Menon906de572013-06-18 17:01:40 -07004926 drv_ctx.ip_buf.actualcount,
4927 drv_ctx.ip_buf.buffer_size);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004928
Arun Menon906de572013-06-18 17:01:40 -07004929 m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
4930 calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4931
4932 if (m_inp_mem_ptr == NULL) {
4933 return OMX_ErrorInsufficientResources;
4934 }
4935
4936 drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
4937 calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4938
4939 if (drv_ctx.ptr_inputbuffer == NULL) {
4940 return OMX_ErrorInsufficientResources;
4941 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004942#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07004943 drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
4944 calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
Shalaj Jain273b3e02012-06-22 19:08:03 -07004945
Arun Menon906de572013-06-18 17:01:40 -07004946 if (drv_ctx.ip_buf_ion_info == NULL) {
4947 return OMX_ErrorInsufficientResources;
4948 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004949#endif
4950
Arun Menon906de572013-06-18 17:01:40 -07004951 for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
4952 drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004953#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07004954 drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07004955#endif
Shalaj Jain273b3e02012-06-22 19:08:03 -07004956 }
4957 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004958
Arun Menon906de572013-06-18 17:01:40 -07004959 for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
4960 if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004961 DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
Arun Menon906de572013-06-18 17:01:40 -07004962 break;
4963 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07004964 }
Arun Menon906de572013-06-18 17:01:40 -07004965
4966 if (i < drv_ctx.ip_buf.actualcount) {
4967 struct v4l2_buffer buf;
4968 struct v4l2_plane plane;
4969 int rc;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004970 DEBUG_PRINT_LOW("Allocate input Buffer");
Arun Menon906de572013-06-18 17:01:40 -07004971#ifdef USE_ION
4972 drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4973 drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
4974 &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
4975 &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
4976 if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
4977 return OMX_ErrorInsufficientResources;
4978 }
4979 pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4980#else
4981 pmem_fd = open (MEM_DEVICE,O_RDWR);
4982
4983 if (pmem_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004984 DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
Arun Menon906de572013-06-18 17:01:40 -07004985 return OMX_ErrorInsufficientResources;
4986 }
4987
4988 if (pmem_fd == 0) {
4989 pmem_fd = open (MEM_DEVICE,O_RDWR);
4990
4991 if (pmem_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004992 DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
Arun Menon906de572013-06-18 17:01:40 -07004993 return OMX_ErrorInsufficientResources;
4994 }
4995 }
4996
4997 if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
4998 drv_ctx.ip_buf.alignment)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07004999 DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
Arun Menon906de572013-06-18 17:01:40 -07005000 close(pmem_fd);
5001 return OMX_ErrorInsufficientResources;
5002 }
5003#endif
5004 if (!secure_mode) {
5005 buf_addr = (unsigned char *)mmap(NULL,
5006 drv_ctx.ip_buf.buffer_size,
5007 PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
5008
5009 if (buf_addr == MAP_FAILED) {
5010 close(pmem_fd);
5011#ifdef USE_ION
5012 free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
5013#endif
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005014 DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
Arun Menon906de572013-06-18 17:01:40 -07005015 return OMX_ErrorInsufficientResources;
5016 }
5017 }
5018 *bufferHdr = (m_inp_mem_ptr + i);
5019 if (secure_mode)
5020 drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
5021 else
5022 drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
5023 drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
5024 drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
5025 drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
5026 drv_ctx.ptr_inputbuffer [i].offset = 0;
5027
5028
5029 buf.index = i;
5030 buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
5031 buf.memory = V4L2_MEMORY_USERPTR;
5032 plane.bytesused = 0;
5033 plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
5034 plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
5035 plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
5036 plane.reserved[1] = 0;
5037 plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
5038 buf.m.planes = &plane;
5039 buf.length = 1;
5040
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005041 DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i,
Arun Menon906de572013-06-18 17:01:40 -07005042 drv_ctx.ptr_inputbuffer[i].bufferaddr);
5043
5044 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
5045
5046 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005047 DEBUG_PRINT_ERROR("Failed to prepare bufs");
Arun Menon906de572013-06-18 17:01:40 -07005048 /*TODO: How to handle this case */
5049 return OMX_ErrorInsufficientResources;
5050 }
5051
5052 input = *bufferHdr;
5053 BITMASK_SET(&m_inp_bm_count,i);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005054 DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
Arun Menon906de572013-06-18 17:01:40 -07005055 if (secure_mode)
5056 input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
5057 else
5058 input->pBuffer = (OMX_U8 *)buf_addr;
5059 input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
5060 input->nVersion.nVersion = OMX_SPEC_VERSION;
5061 input->nAllocLen = drv_ctx.ip_buf.buffer_size;
5062 input->pAppPrivate = appData;
5063 input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
5064 input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
5065
5066 if (drv_ctx.disable_dmx) {
5067 eRet = allocate_desc_buffer(i);
5068 }
5069 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005070 DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
Arun Menon906de572013-06-18 17:01:40 -07005071 eRet = OMX_ErrorInsufficientResources;
5072 }
5073 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005074}
5075
5076
5077/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07005078 FUNCTION
5079 omx_vdec::AllocateOutputBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07005080
Arun Menon906de572013-06-18 17:01:40 -07005081 DESCRIPTION
5082 Helper fn for AllocateBuffer in the output pin
Shalaj Jain273b3e02012-06-22 19:08:03 -07005083
Arun Menon906de572013-06-18 17:01:40 -07005084 PARAMETERS
5085 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005086
Arun Menon906de572013-06-18 17:01:40 -07005087 RETURN VALUE
5088 OMX Error None if everything went well.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005089
Arun Menon906de572013-06-18 17:01:40 -07005090 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07005091OMX_ERRORTYPE omx_vdec::allocate_output_buffer(
Arun Menon906de572013-06-18 17:01:40 -07005092 OMX_IN OMX_HANDLETYPE hComp,
5093 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
5094 OMX_IN OMX_U32 port,
5095 OMX_IN OMX_PTR appData,
5096 OMX_IN OMX_U32 bytes)
Shalaj Jain273b3e02012-06-22 19:08:03 -07005097{
Arun Menon906de572013-06-18 17:01:40 -07005098 OMX_ERRORTYPE eRet = OMX_ErrorNone;
5099 OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
5100 unsigned i= 0; // Temporary counter
5101 struct vdec_setbuffer_cmd setbuffers;
5102 int extra_idx = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005103#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07005104 int ion_device_fd =-1;
5105 struct ion_allocation_data ion_alloc_data;
5106 struct ion_fd_data fd_ion_data;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005107#endif
Arun Menon906de572013-06-18 17:01:40 -07005108 if (!m_out_mem_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005109 DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
Arun Menon906de572013-06-18 17:01:40 -07005110 drv_ctx.op_buf.actualcount,
5111 drv_ctx.op_buf.buffer_size);
5112 int nBufHdrSize = 0;
5113 int nPlatformEntrySize = 0;
5114 int nPlatformListSize = 0;
5115 int nPMEMInfoSize = 0;
5116 int pmem_fd = -1;
5117 unsigned char *pmem_baseaddress = NULL;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005118
Arun Menon906de572013-06-18 17:01:40 -07005119 OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList;
5120 OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry;
5121 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005122
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005123 DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
Arun Menon906de572013-06-18 17:01:40 -07005124 drv_ctx.op_buf.actualcount);
5125 nBufHdrSize = drv_ctx.op_buf.actualcount *
5126 sizeof(OMX_BUFFERHEADERTYPE);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005127
Arun Menon906de572013-06-18 17:01:40 -07005128 nPMEMInfoSize = drv_ctx.op_buf.actualcount *
5129 sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
5130 nPlatformListSize = drv_ctx.op_buf.actualcount *
5131 sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
5132 nPlatformEntrySize = drv_ctx.op_buf.actualcount *
5133 sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005134
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005135 DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
Arun Menon906de572013-06-18 17:01:40 -07005136 sizeof(OMX_BUFFERHEADERTYPE),
5137 nPMEMInfoSize,
5138 nPlatformListSize);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005139 DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
Arun Menon906de572013-06-18 17:01:40 -07005140 drv_ctx.op_buf.actualcount);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005141#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07005142 ion_device_fd = alloc_map_ion_memory(
5143 drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
5144 drv_ctx.op_buf.alignment,
5145 &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
5146 if (ion_device_fd < 0) {
5147 return OMX_ErrorInsufficientResources;
5148 }
5149 pmem_fd = fd_ion_data.fd;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005150#else
Arun Menon906de572013-06-18 17:01:40 -07005151 pmem_fd = open (MEM_DEVICE,O_RDWR);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005152
Arun Menon906de572013-06-18 17:01:40 -07005153 if (pmem_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005154 DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
Arun Menon906de572013-06-18 17:01:40 -07005155 drv_ctx.op_buf.buffer_size);
5156 return OMX_ErrorInsufficientResources;
5157 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005158
Arun Menon906de572013-06-18 17:01:40 -07005159 if (pmem_fd == 0) {
5160 pmem_fd = open (MEM_DEVICE,O_RDWR);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005161
Arun Menon906de572013-06-18 17:01:40 -07005162 if (pmem_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005163 DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
Arun Menon906de572013-06-18 17:01:40 -07005164 drv_ctx.op_buf.buffer_size);
5165 return OMX_ErrorInsufficientResources;
5166 }
5167 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005168
Arun Menon906de572013-06-18 17:01:40 -07005169 if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
5170 drv_ctx.op_buf.actualcount,
5171 drv_ctx.op_buf.alignment)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005172 DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
Arun Menon906de572013-06-18 17:01:40 -07005173 close(pmem_fd);
5174 return OMX_ErrorInsufficientResources;
5175 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005176#endif
Arun Menon906de572013-06-18 17:01:40 -07005177 if (!secure_mode) {
5178 pmem_baseaddress = (unsigned char *)mmap(NULL,
5179 (drv_ctx.op_buf.buffer_size *
5180 drv_ctx.op_buf.actualcount),
5181 PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
5182 if (pmem_baseaddress == MAP_FAILED) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005183 DEBUG_PRINT_ERROR("MMAP failed for Size %d",
Arun Menon906de572013-06-18 17:01:40 -07005184 drv_ctx.op_buf.buffer_size);
5185 close(pmem_fd);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005186#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07005187 free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005188#endif
Arun Menon906de572013-06-18 17:01:40 -07005189 return OMX_ErrorInsufficientResources;
5190 }
5191 }
5192 m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1);
5193 // Alloc mem for platform specific info
5194 char *pPtr=NULL;
5195 pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
5196 nPMEMInfoSize,1);
5197 drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
5198 calloc (sizeof(struct vdec_bufferpayload),
5199 drv_ctx.op_buf.actualcount);
5200 drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\
5201 calloc (sizeof (struct vdec_output_frameinfo),
5202 drv_ctx.op_buf.actualcount);
Arun Menon8544ead2014-05-08 17:42:29 -07005203 if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
5204 DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer ");
5205 return OMX_ErrorInsufficientResources;
5206 }
5207
Arun Menon906de572013-06-18 17:01:40 -07005208#ifdef USE_ION
5209 drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
5210 calloc (sizeof(struct vdec_ion),
5211 drv_ctx.op_buf.actualcount);
Arun Menon8544ead2014-05-08 17:42:29 -07005212 if (!drv_ctx.op_buf_ion_info) {
5213 DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
5214 return OMX_ErrorInsufficientResources;
5215 }
Arun Menon906de572013-06-18 17:01:40 -07005216#endif
5217
5218 if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
5219 && drv_ctx.ptr_respbuffer) {
5220 drv_ctx.ptr_outputbuffer[0].mmaped_size =
5221 (drv_ctx.op_buf.buffer_size *
5222 drv_ctx.op_buf.actualcount);
5223 bufHdr = m_out_mem_ptr;
5224 m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
5225 m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
5226 (((char *) m_platform_list) + nPlatformListSize);
5227 m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
5228 (((char *) m_platform_entry) + nPlatformEntrySize);
5229 pPlatformList = m_platform_list;
5230 pPlatformEntry = m_platform_entry;
5231 pPMEMInfo = m_pmem_info;
5232
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005233 DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
Arun Menon906de572013-06-18 17:01:40 -07005234
5235 // Settting the entire storage nicely
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005236 DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
5237 DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
Arun Menon906de572013-06-18 17:01:40 -07005238 for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
5239 bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
5240 bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
5241 // Set the values when we determine the right HxW param
5242 bufHdr->nAllocLen = bytes;
5243 bufHdr->nFilledLen = 0;
5244 bufHdr->pAppPrivate = appData;
5245 bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
5246 // Platform specific PMEM Information
5247 // Initialize the Platform Entry
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005248 //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
Arun Menon906de572013-06-18 17:01:40 -07005249 pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
5250 pPlatformEntry->entry = pPMEMInfo;
5251 // Initialize the Platform List
5252 pPlatformList->nEntries = 1;
5253 pPlatformList->entryList = pPlatformEntry;
5254 // Keep pBuffer NULL till vdec is opened
5255 bufHdr->pBuffer = NULL;
5256 bufHdr->nOffset = 0;
5257
5258 pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i;
5259 pPMEMInfo->pmem_fd = 0;
5260 bufHdr->pPlatformPrivate = pPlatformList;
5261
5262 drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
5263 m_pmem_info[i].pmem_fd = pmem_fd;
5264#ifdef USE_ION
5265 drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
5266 drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
5267 drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
5268#endif
5269
5270 /*Create a mapping between buffers*/
5271 bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
5272 drv_ctx.ptr_respbuffer[i].client_data = (void *)\
5273 &drv_ctx.ptr_outputbuffer[i];
5274 drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
5275 drv_ctx.ptr_outputbuffer[i].bufferaddr =
5276 pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05305277 m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
5278 m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
5279 m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
Arun Menon906de572013-06-18 17:01:40 -07005280
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005281 DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p",
Arun Menon906de572013-06-18 17:01:40 -07005282 pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
5283 drv_ctx.ptr_outputbuffer[i].bufferaddr);
5284 // Move the buffer and buffer header pointers
5285 bufHdr++;
5286 pPMEMInfo++;
5287 pPlatformEntry++;
5288 pPlatformList++;
5289 }
5290 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005291 DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
Arun Menon906de572013-06-18 17:01:40 -07005292 m_out_mem_ptr, pPtr);
5293 if (m_out_mem_ptr) {
5294 free(m_out_mem_ptr);
5295 m_out_mem_ptr = NULL;
5296 }
5297 if (pPtr) {
5298 free(pPtr);
5299 pPtr = NULL;
5300 }
5301 if (drv_ctx.ptr_outputbuffer) {
5302 free(drv_ctx.ptr_outputbuffer);
5303 drv_ctx.ptr_outputbuffer = NULL;
5304 }
5305 if (drv_ctx.ptr_respbuffer) {
5306 free(drv_ctx.ptr_respbuffer);
5307 drv_ctx.ptr_respbuffer = NULL;
5308 }
5309#ifdef USE_ION
5310 if (drv_ctx.op_buf_ion_info) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005311 DEBUG_PRINT_LOW("Free o/p ion context");
Arun Menon906de572013-06-18 17:01:40 -07005312 free(drv_ctx.op_buf_ion_info);
5313 drv_ctx.op_buf_ion_info = NULL;
5314 }
5315#endif
5316 eRet = OMX_ErrorInsufficientResources;
5317 }
5318 if (eRet == OMX_ErrorNone)
5319 eRet = allocate_extradata();
5320 }
5321
5322 for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
5323 if (BITMASK_ABSENT(&m_out_bm_count,i)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005324 DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
Arun Menon906de572013-06-18 17:01:40 -07005325 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005326 }
5327 }
Arun Menon906de572013-06-18 17:01:40 -07005328
5329 if (eRet == OMX_ErrorNone) {
5330 if (i < drv_ctx.op_buf.actualcount) {
5331 struct v4l2_buffer buf;
5332 struct v4l2_plane plane[VIDEO_MAX_PLANES];
5333 int rc;
5334 m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
5335
5336 drv_ctx.ptr_outputbuffer[i].buffer_len =
5337 drv_ctx.op_buf.buffer_size;
5338
5339 *bufferHdr = (m_out_mem_ptr + i );
5340 if (secure_mode) {
5341 drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
5342 }
5343 drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
5344
5345 buf.index = i;
5346 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
5347 buf.memory = V4L2_MEMORY_USERPTR;
5348 plane[0].length = drv_ctx.op_buf.buffer_size;
5349 plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
5350 (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005351#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07005352 plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005353#endif
Arun Menon906de572013-06-18 17:01:40 -07005354 plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
5355 plane[0].data_offset = 0;
5356 extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
5357 if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
5358 plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
5359 plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005360#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07005361 plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005362#endif
Arun Menon906de572013-06-18 17:01:40 -07005363 plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
5364 plane[extra_idx].data_offset = 0;
5365 } else if (extra_idx >= VIDEO_MAX_PLANES) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005366 DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
Arun Menon906de572013-06-18 17:01:40 -07005367 return OMX_ErrorBadParameter;
5368 }
5369 buf.m.planes = plane;
5370 buf.length = drv_ctx.num_planes;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005371 DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
Arun Menon906de572013-06-18 17:01:40 -07005372 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
5373 if (rc) {
5374 /*TODO: How to handle this case */
5375 return OMX_ErrorInsufficientResources;
5376 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005377
Arun Menon906de572013-06-18 17:01:40 -07005378 if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
5379 enum v4l2_buf_type buf_type;
5380 buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
5381 rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
5382 if (rc) {
5383 return OMX_ErrorInsufficientResources;
5384 } else {
5385 streaming[CAPTURE_PORT] = true;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005386 DEBUG_PRINT_LOW("STREAMON Successful");
Arun Menon906de572013-06-18 17:01:40 -07005387 }
5388 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005389
Arun Menon906de572013-06-18 17:01:40 -07005390 (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
5391 (*bufferHdr)->pAppPrivate = appData;
5392 BITMASK_SET(&m_out_bm_count,i);
5393 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005394 DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
Arun Menon906de572013-06-18 17:01:40 -07005395 eRet = OMX_ErrorInsufficientResources;
5396 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005397 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005398
Arun Menon906de572013-06-18 17:01:40 -07005399 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005400}
5401
5402
5403// AllocateBuffer -- API Call
5404/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07005405 FUNCTION
5406 omx_vdec::AllocateBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07005407
Arun Menon906de572013-06-18 17:01:40 -07005408 DESCRIPTION
5409 Returns zero if all the buffers released..
Shalaj Jain273b3e02012-06-22 19:08:03 -07005410
Arun Menon906de572013-06-18 17:01:40 -07005411 PARAMETERS
5412 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005413
Arun Menon906de572013-06-18 17:01:40 -07005414 RETURN VALUE
5415 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07005416
Arun Menon906de572013-06-18 17:01:40 -07005417 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07005418OMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07005419 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
5420 OMX_IN OMX_U32 port,
5421 OMX_IN OMX_PTR appData,
5422 OMX_IN OMX_U32 bytes)
Shalaj Jain273b3e02012-06-22 19:08:03 -07005423{
5424 unsigned i = 0;
5425 OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
5426
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005427 DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
Arun Menon906de572013-06-18 17:01:40 -07005428 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005429 DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005430 return OMX_ErrorInvalidState;
5431 }
5432
Arun Menon906de572013-06-18 17:01:40 -07005433 if (port == OMX_CORE_INPUT_PORT_INDEX) {
5434 if (arbitrary_bytes) {
5435 eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
5436 } else {
5437 eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
5438 }
5439 } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
Vinay Kaliada4f4422013-01-09 10:45:03 -08005440 eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
5441 appData,bytes);
Arun Menon906de572013-06-18 17:01:40 -07005442 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005443 DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
Arun Menon906de572013-06-18 17:01:40 -07005444 eRet = OMX_ErrorBadPortIndex;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005445 }
5446 DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
Arun Menon906de572013-06-18 17:01:40 -07005447 if (eRet == OMX_ErrorNone) {
5448 if (allocate_done()) {
5449 if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07005450 // Send the callback now
5451 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
5452 post_event(OMX_CommandStateSet,OMX_StateIdle,
Arun Menon906de572013-06-18 17:01:40 -07005453 OMX_COMPONENT_GENERATE_EVENT);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005454 }
5455 }
Arun Menon906de572013-06-18 17:01:40 -07005456 if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
5457 if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
5458 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
5459 post_event(OMX_CommandPortEnable,
Shalaj Jain273b3e02012-06-22 19:08:03 -07005460 OMX_CORE_INPUT_PORT_INDEX,
5461 OMX_COMPONENT_GENERATE_EVENT);
Arun Menon906de572013-06-18 17:01:40 -07005462 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005463 }
Arun Menon906de572013-06-18 17:01:40 -07005464 if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
5465 if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
5466 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005467 post_event(OMX_CommandPortEnable,
Arun Menon906de572013-06-18 17:01:40 -07005468 OMX_CORE_OUTPUT_PORT_INDEX,
5469 OMX_COMPONENT_GENERATE_EVENT);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005470 }
5471 }
5472 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005473 DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005474 return eRet;
5475}
5476
5477// Free Buffer - API call
5478/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07005479 FUNCTION
5480 omx_vdec::FreeBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07005481
Arun Menon906de572013-06-18 17:01:40 -07005482 DESCRIPTION
Shalaj Jain273b3e02012-06-22 19:08:03 -07005483
Arun Menon906de572013-06-18 17:01:40 -07005484 PARAMETERS
5485 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005486
Arun Menon906de572013-06-18 17:01:40 -07005487 RETURN VALUE
5488 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07005489
Arun Menon906de572013-06-18 17:01:40 -07005490 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07005491OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07005492 OMX_IN OMX_U32 port,
5493 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07005494{
5495 OMX_ERRORTYPE eRet = OMX_ErrorNone;
5496 unsigned int nPortIndex;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005497 DEBUG_PRINT_LOW("In for decoder free_buffer");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005498
Arun Menon906de572013-06-18 17:01:40 -07005499 if (m_state == OMX_StateIdle &&
5500 (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005501 DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
Arun Menon906de572013-06-18 17:01:40 -07005502 } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
5503 (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005504 DEBUG_PRINT_LOW("Free Buffer while port %lu disabled", port);
Arun Menon906de572013-06-18 17:01:40 -07005505 } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
5506 BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
5507 (port == OMX_CORE_OUTPUT_PORT_INDEX &&
5508 BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005509 DEBUG_PRINT_LOW("Free Buffer while port %lu enable pending", port);
Arun Menon906de572013-06-18 17:01:40 -07005510 } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005511 DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005512 post_event(OMX_EventError,
Arun Menon906de572013-06-18 17:01:40 -07005513 OMX_ErrorPortUnpopulated,
5514 OMX_COMPONENT_GENERATE_EVENT);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005515
5516 return OMX_ErrorIncorrectStateOperation;
Arun Menon906de572013-06-18 17:01:40 -07005517 } else if (m_state != OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005518 DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005519 post_event(OMX_EventError,
Arun Menon906de572013-06-18 17:01:40 -07005520 OMX_ErrorPortUnpopulated,
5521 OMX_COMPONENT_GENERATE_EVENT);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005522 }
5523
Arun Menon906de572013-06-18 17:01:40 -07005524 if (port == OMX_CORE_INPUT_PORT_INDEX) {
5525 /*Check if arbitrary bytes*/
5526 if (!arbitrary_bytes && !input_use_buffer)
5527 nPortIndex = buffer - m_inp_mem_ptr;
5528 else
5529 nPortIndex = buffer - m_inp_heap_ptr;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005530
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005531 DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
Arun Menon906de572013-06-18 17:01:40 -07005532 if (nPortIndex < drv_ctx.ip_buf.actualcount) {
5533 // Clear the bit associated with it.
5534 BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
5535 BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
5536 if (input_use_buffer == true) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07005537
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005538 DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
Arun Menon906de572013-06-18 17:01:40 -07005539 if (m_phdr_pmem_ptr)
5540 free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
5541 } else {
5542 if (arbitrary_bytes) {
5543 if (m_phdr_pmem_ptr)
5544 free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
5545 else
5546 free_input_buffer(nPortIndex,NULL);
5547 } else
5548 free_input_buffer(buffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005549 }
Arun Menon906de572013-06-18 17:01:40 -07005550 m_inp_bPopulated = OMX_FALSE;
Surajit Podder12aefac2013-08-06 18:43:32 +05305551 if(release_input_done())
5552 release_buffers(this, VDEC_BUFFER_TYPE_INPUT);
Arun Menon906de572013-06-18 17:01:40 -07005553 /*Free the Buffer Header*/
5554 if (release_input_done()) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005555 DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
Arun Menon906de572013-06-18 17:01:40 -07005556 free_input_buffer_header();
5557 }
5558 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005559 DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005560 eRet = OMX_ErrorBadPortIndex;
5561 }
5562
Arun Menon906de572013-06-18 17:01:40 -07005563 if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
5564 && release_input_done()) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005565 DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005566 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
5567 post_event(OMX_CommandPortDisable,
Arun Menon906de572013-06-18 17:01:40 -07005568 OMX_CORE_INPUT_PORT_INDEX,
5569 OMX_COMPONENT_GENERATE_EVENT);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005570 }
Arun Menon906de572013-06-18 17:01:40 -07005571 } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07005572 // check if the buffer is valid
Vinay Kaliada4f4422013-01-09 10:45:03 -08005573 nPortIndex = buffer - client_buffers.get_il_buf_hdr();
Arun Menon906de572013-06-18 17:01:40 -07005574 if (nPortIndex < drv_ctx.op_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005575 DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005576 // Clear the bit associated with it.
5577 BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
5578 m_out_bPopulated = OMX_FALSE;
Vinay Kaliada4f4422013-01-09 10:45:03 -08005579 client_buffers.free_output_buffer (buffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005580
Surajit Podder12aefac2013-08-06 18:43:32 +05305581 if(release_output_done()) {
5582 release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT);
5583 }
Arun Menon906de572013-06-18 17:01:40 -07005584 if (release_output_done()) {
5585 free_output_buffer_header();
Shalaj Jain273b3e02012-06-22 19:08:03 -07005586 }
Arun Menon906de572013-06-18 17:01:40 -07005587 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005588 DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005589 eRet = OMX_ErrorBadPortIndex;
5590 }
Arun Menon906de572013-06-18 17:01:40 -07005591 if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
5592 && release_output_done()) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005593 DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
Shalaj Jain273b3e02012-06-22 19:08:03 -07005594
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005595 DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
Arun Menon906de572013-06-18 17:01:40 -07005596 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005597#ifdef _ANDROID_ICS_
Arun Menon906de572013-06-18 17:01:40 -07005598 if (m_enable_android_native_buffers) {
5599 DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
5600 memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5601 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005602#endif
5603
Arun Menon906de572013-06-18 17:01:40 -07005604 post_event(OMX_CommandPortDisable,
5605 OMX_CORE_OUTPUT_PORT_INDEX,
5606 OMX_COMPONENT_GENERATE_EVENT);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005607 }
Arun Menon906de572013-06-18 17:01:40 -07005608 } else {
Shalaj Jain273b3e02012-06-22 19:08:03 -07005609 eRet = OMX_ErrorBadPortIndex;
5610 }
Arun Menon906de572013-06-18 17:01:40 -07005611 if ((eRet == OMX_ErrorNone) &&
5612 (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
5613 if (release_done()) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07005614 // Send the callback now
5615 BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
5616 post_event(OMX_CommandStateSet, OMX_StateLoaded,
Arun Menon906de572013-06-18 17:01:40 -07005617 OMX_COMPONENT_GENERATE_EVENT);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005618 }
5619 }
5620 return eRet;
5621}
5622
5623
5624/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07005625 FUNCTION
5626 omx_vdec::EmptyThisBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07005627
Arun Menon906de572013-06-18 17:01:40 -07005628 DESCRIPTION
5629 This routine is used to push the encoded video frames to
5630 the video decoder.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005631
Arun Menon906de572013-06-18 17:01:40 -07005632 PARAMETERS
5633 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005634
Arun Menon906de572013-06-18 17:01:40 -07005635 RETURN VALUE
5636 OMX Error None if everything went successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005637
Arun Menon906de572013-06-18 17:01:40 -07005638 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07005639OMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07005640 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07005641{
Arun Menon906de572013-06-18 17:01:40 -07005642 OMX_ERRORTYPE ret1 = OMX_ErrorNone;
5643 unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005644
Arun Menon906de572013-06-18 17:01:40 -07005645 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005646 DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
Arun Menon906de572013-06-18 17:01:40 -07005647 return OMX_ErrorInvalidState;
5648 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005649
Arun Menon906de572013-06-18 17:01:40 -07005650 if (buffer == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005651 DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
Arun Menon906de572013-06-18 17:01:40 -07005652 return OMX_ErrorBadParameter;
5653 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005654
Arun Menon906de572013-06-18 17:01:40 -07005655 if (!m_inp_bEnabled) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005656 DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
Arun Menon906de572013-06-18 17:01:40 -07005657 return OMX_ErrorIncorrectStateOperation;
5658 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005659
Arun Menon906de572013-06-18 17:01:40 -07005660 if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005661 DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
Arun Menon906de572013-06-18 17:01:40 -07005662 return OMX_ErrorBadPortIndex;
5663 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005664
5665#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -07005666 if (iDivXDrmDecrypt) {
5667 OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
5668 if (drmErr != OMX_ErrorNone) {
5669 // this error can be ignored
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005670 DEBUG_PRINT_LOW("ERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
Arun Menon906de572013-06-18 17:01:40 -07005671 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005672 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005673#endif //_ANDROID_
Arun Menon906de572013-06-18 17:01:40 -07005674 if (perf_flag) {
5675 if (!latency) {
5676 dec_time.stop();
5677 latency = dec_time.processing_time_us();
5678 dec_time.start();
5679 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005680 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005681
Arun Menon906de572013-06-18 17:01:40 -07005682 if (arbitrary_bytes) {
5683 nBufferIndex = buffer - m_inp_heap_ptr;
5684 } else {
5685 if (input_use_buffer == true) {
5686 nBufferIndex = buffer - m_inp_heap_ptr;
5687 m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
5688 m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
5689 m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
5690 buffer = &m_inp_mem_ptr[nBufferIndex];
5691 DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %lu",
5692 &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
5693 } else {
5694 nBufferIndex = buffer - m_inp_mem_ptr;
5695 }
5696 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005697
Arun Menon906de572013-06-18 17:01:40 -07005698 if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005699 DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
Arun Menon906de572013-06-18 17:01:40 -07005700 return OMX_ErrorBadParameter;
5701 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005702
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07005703 if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
5704 codec_config_flag = true;
5705 DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
5706 }
5707
Arun Menon906de572013-06-18 17:01:40 -07005708 DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
5709 buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
5710 if (arbitrary_bytes) {
5711 post_event ((unsigned)hComp,(unsigned)buffer,
Shalaj Jain273b3e02012-06-22 19:08:03 -07005712 OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
Arun Menon906de572013-06-18 17:01:40 -07005713 } else {
Arun Menon906de572013-06-18 17:01:40 -07005714 post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
5715 }
Praveen Chavanece713f2014-12-10 18:00:04 -08005716 time_stamp_dts.insert_timestamp(buffer);
Arun Menon906de572013-06-18 17:01:40 -07005717 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005718}
5719
5720/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07005721 FUNCTION
5722 omx_vdec::empty_this_buffer_proxy
Shalaj Jain273b3e02012-06-22 19:08:03 -07005723
Arun Menon906de572013-06-18 17:01:40 -07005724 DESCRIPTION
5725 This routine is used to push the encoded video frames to
5726 the video decoder.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005727
Arun Menon906de572013-06-18 17:01:40 -07005728 PARAMETERS
5729 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005730
Arun Menon906de572013-06-18 17:01:40 -07005731 RETURN VALUE
5732 OMX Error None if everything went successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005733
Arun Menon906de572013-06-18 17:01:40 -07005734 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07005735OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07005736 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07005737{
Arun Menon906de572013-06-18 17:01:40 -07005738 int push_cnt = 0,i=0;
5739 unsigned nPortIndex = 0;
5740 OMX_ERRORTYPE ret = OMX_ErrorNone;
5741 struct vdec_input_frameinfo frameinfo;
5742 struct vdec_bufferpayload *temp_buffer;
5743 struct vdec_seqheader seq_header;
5744 bool port_setting_changed = true;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005745
Arun Menon906de572013-06-18 17:01:40 -07005746 /*Should we generate a Aync error event*/
5747 if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005748 DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
Arun Menon906de572013-06-18 17:01:40 -07005749 return OMX_ErrorBadParameter;
5750 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005751
Arun Menon906de572013-06-18 17:01:40 -07005752 nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005753
Arun Menon906de572013-06-18 17:01:40 -07005754 if (nPortIndex > drv_ctx.ip_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005755 DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
Arun Menon906de572013-06-18 17:01:40 -07005756 nPortIndex);
5757 return OMX_ErrorBadParameter;
5758 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005759
Arun Menon906de572013-06-18 17:01:40 -07005760 pending_input_buffers++;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005761
Arun Menon906de572013-06-18 17:01:40 -07005762 /* return zero length and not an EOS buffer */
5763 if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
5764 ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005765 DEBUG_PRINT_HIGH("return zero legth buffer");
Arun Menon906de572013-06-18 17:01:40 -07005766 post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5767 OMX_COMPONENT_GENERATE_EBD);
5768 return OMX_ErrorNone;
5769 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005770
c_sridur0af9cef2015-02-05 12:07:17 +05305771 if (input_flush_progress == true) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005772 DEBUG_PRINT_LOW("Flush in progress return buffer ");
Arun Menon906de572013-06-18 17:01:40 -07005773 post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5774 OMX_COMPONENT_GENERATE_EBD);
5775 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005776 }
5777
Arun Menon906de572013-06-18 17:01:40 -07005778 temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005779
Surajit Podderd2644d52013-08-28 17:59:06 +05305780 if ((temp_buffer - drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) {
Arun Menon906de572013-06-18 17:01:40 -07005781 return OMX_ErrorBadParameter;
5782 }
5783 /* If its first frame, H264 codec and reject is true, then parse the nal
5784 and get the profile. Based on this, reject the clip playback */
5785 if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
5786 m_reject_avc_1080p_mp) {
5787 first_frame = 1;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005788 DEBUG_PRINT_ERROR("Parse nal to get the profile");
Arun Menon906de572013-06-18 17:01:40 -07005789 h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
5790 NALU_TYPE_SPS);
5791 m_profile = h264_parser->get_profile();
5792 ret = is_video_session_supported();
5793 if (ret) {
5794 post_event ((unsigned int)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
5795 post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
5796 /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
5797 m_state = OMX_StateInvalid;
5798 return OMX_ErrorNone;
5799 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005800 }
5801
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005802 DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
Arun Menon906de572013-06-18 17:01:40 -07005803 /*for use buffer we need to memcpy the data*/
5804 temp_buffer->buffer_len = buffer->nFilledLen;
5805
5806 if (input_use_buffer) {
5807 if (buffer->nFilledLen <= temp_buffer->buffer_len) {
5808 if (arbitrary_bytes) {
5809 memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5810 } else {
5811 memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
5812 buffer->nFilledLen);
5813 }
5814 } else {
5815 return OMX_ErrorBadParameter;
5816 }
5817
5818 }
5819
5820 frameinfo.bufferaddr = temp_buffer->bufferaddr;
5821 frameinfo.client_data = (void *) buffer;
5822 frameinfo.datalen = temp_buffer->buffer_len;
5823 frameinfo.flags = 0;
5824 frameinfo.offset = buffer->nOffset;
5825 frameinfo.pmem_fd = temp_buffer->pmem_fd;
5826 frameinfo.pmem_offset = temp_buffer->offset;
5827 frameinfo.timestamp = buffer->nTimeStamp;
5828 if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
5829 DEBUG_PRINT_LOW("ETB: dmx enabled");
5830 if (m_demux_entries == 0) {
5831 extract_demux_addr_offsets(buffer);
5832 }
5833
5834 DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%lu",m_demux_entries);
5835 handle_demux_data(buffer);
5836 frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
5837 frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
5838 } else {
5839 frameinfo.desc_addr = NULL;
5840 frameinfo.desc_size = 0;
5841 }
5842 if (!arbitrary_bytes) {
5843 frameinfo.flags |= buffer->nFlags;
5844 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005845
5846#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -07005847 if (m_debug_timestamp) {
5848 if (arbitrary_bytes) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005849 DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
Arun Menon906de572013-06-18 17:01:40 -07005850 m_timestamp_list.insert_ts(buffer->nTimeStamp);
5851 } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005852 DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
Arun Menon906de572013-06-18 17:01:40 -07005853 m_timestamp_list.insert_ts(buffer->nTimeStamp);
5854 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005855 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005856#endif
5857
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07005858log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005859
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07005860if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
Arun Menon906de572013-06-18 17:01:40 -07005861 frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5862 buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5863 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07005864
Arun Menon906de572013-06-18 17:01:40 -07005865 if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005866 DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
Arun Menon906de572013-06-18 17:01:40 -07005867 frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
5868 h264_scratch.nFilledLen = 0;
5869 nal_count = 0;
5870 look_ahead_nal = false;
5871 frame_count = 0;
5872 if (m_frame_parser.mutils)
5873 m_frame_parser.mutils->initialize_frame_checking_environment();
5874 m_frame_parser.flush();
5875 h264_last_au_ts = LLONG_MAX;
5876 h264_last_au_flags = 0;
5877 memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
5878 m_demux_entries = 0;
5879 }
5880 struct v4l2_buffer buf;
5881 struct v4l2_plane plane;
5882 memset( (void *)&buf, 0, sizeof(buf));
5883 memset( (void *)&plane, 0, sizeof(plane));
5884 int rc;
5885 unsigned long print_count;
5886 if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
Deva Ramasubramanianc1c7c122013-09-10 21:50:43 -07005887 buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005888 DEBUG_PRINT_HIGH("INPUT EOS reached") ;
Arun Menon906de572013-06-18 17:01:40 -07005889 }
5890 OMX_ERRORTYPE eRet = OMX_ErrorNone;
5891 buf.index = nPortIndex;
5892 buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
5893 buf.memory = V4L2_MEMORY_USERPTR;
5894 plane.bytesused = temp_buffer->buffer_len;
5895 plane.length = drv_ctx.ip_buf.buffer_size;
5896 plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
5897 (unsigned long)temp_buffer->offset;
5898 plane.reserved[0] = temp_buffer->pmem_fd;
5899 plane.reserved[1] = temp_buffer->offset;
5900 plane.data_offset = 0;
5901 buf.m.planes = &plane;
5902 buf.length = 1;
5903 if (frameinfo.timestamp >= LLONG_MAX) {
5904 buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
5905 }
5906 //assumption is that timestamp is in milliseconds
5907 buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
5908 buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
5909 buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
5910 buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
Deva Ramasubramanian46a17952012-08-24 11:35:26 -07005911
Pushkaraj Patil20bd6bf2014-12-22 19:33:08 +05305912 if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
5913 DEBUG_PRINT_LOW("Increment codec_config buffer counter");
5914 android_atomic_inc(&m_queued_codec_config_count);
5915 }
5916
Arun Menon906de572013-06-18 17:01:40 -07005917 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
5918 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005919 DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver");
Arun Menon906de572013-06-18 17:01:40 -07005920 return OMX_ErrorHardware;
5921 }
Deva Ramasubramanian1fd93812014-03-26 15:17:15 -07005922
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07005923 if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
5924 codec_config_flag = false;
5925 }
Arun Menon906de572013-06-18 17:01:40 -07005926 if (!streaming[OUTPUT_PORT]) {
5927 enum v4l2_buf_type buf_type;
5928 int ret,r;
Vinay Kalia85793762012-06-14 19:12:34 -07005929
Arun Menon906de572013-06-18 17:01:40 -07005930 buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005931 DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
Arun Menon906de572013-06-18 17:01:40 -07005932 ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
5933 if (!ret) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005934 DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
Arun Menon906de572013-06-18 17:01:40 -07005935 streaming[OUTPUT_PORT] = true;
Jia Meng1e236c82014-04-03 10:54:39 +08005936 } else if (errno == EBUSY) {
5937 DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD");
5938 post_event ((unsigned int)buffer, VDEC_S_SUCCESS,
5939 OMX_COMPONENT_GENERATE_EBD);
5940 return OMX_ErrorInsufficientResources;
Arun Menon906de572013-06-18 17:01:40 -07005941 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07005942 DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
Arun Menon906de572013-06-18 17:01:40 -07005943 DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
Jia Meng1e236c82014-04-03 10:54:39 +08005944 post_event ((unsigned int)buffer, VDEC_S_SUCCESS,
Arun Menon906de572013-06-18 17:01:40 -07005945 OMX_COMPONENT_GENERATE_EBD);
5946 return OMX_ErrorBadParameter;
5947 }
5948 }
5949 DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
5950 frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
Shalaj Jain273b3e02012-06-22 19:08:03 -07005951
Arun Menon906de572013-06-18 17:01:40 -07005952 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -07005953}
5954
5955/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07005956 FUNCTION
5957 omx_vdec::FillThisBuffer
Shalaj Jain273b3e02012-06-22 19:08:03 -07005958
Arun Menon906de572013-06-18 17:01:40 -07005959 DESCRIPTION
5960 IL client uses this method to release the frame buffer
5961 after displaying them.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005962
Arun Menon906de572013-06-18 17:01:40 -07005963 PARAMETERS
5964 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07005965
Arun Menon906de572013-06-18 17:01:40 -07005966 RETURN VALUE
5967 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07005968
Arun Menon906de572013-06-18 17:01:40 -07005969 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07005970OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07005971 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07005972{
Jia Meng2d51b932014-07-10 14:02:54 +08005973 unsigned nPortIndex = 0;
Arun Menonbdb80b02013-08-12 17:45:54 -07005974 if (dynamic_buf_mode) {
5975 private_handle_t *handle = NULL;
5976 struct VideoDecoderOutputMetaData *meta;
Arun Menonbdb80b02013-08-12 17:45:54 -07005977 unsigned int nPortIndex = 0;
5978
5979 if (!buffer || !buffer->pBuffer) {
Arun Menon8544ead2014-05-08 17:42:29 -07005980 DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer);
Arun Menonbdb80b02013-08-12 17:45:54 -07005981 return OMX_ErrorBadParameter;
5982 }
5983
5984 //get the buffer type and fd info
5985 meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer;
5986 handle = (private_handle_t *)meta->pHandle;
Arun Menonb49abf22013-12-14 21:38:10 -08005987 DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle);
5988
5989 if (!handle) {
5990 DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle);
5991 return OMX_ErrorBadParameter;
5992 }
Arun Menonbdb80b02013-08-12 17:45:54 -07005993 //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF
5994 nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
5995 drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd;
Arun Menon50ab1bf2014-01-08 18:02:19 -08005996 drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer;
ApurupaPattapuf693a4d2013-12-04 16:07:07 -08005997
5998 //Store private handle from GraphicBuffer
5999 native_buffer[nPortIndex].privatehandle = handle;
6000 native_buffer[nPortIndex].nativehandle = handle;
Deva Ramasubramaniancdbd31b2014-04-14 20:14:28 -07006001
6002 //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite
6003 //this with a more sane size so that we don't compensate in rest of code
6004 //We'll restore this size later on, so that it's transparent to client
6005 buffer->nFilledLen = 0;
Deva Ramasubramanian03a5bb92014-04-25 19:03:50 -07006006 buffer->nAllocLen = handle->size;
Arun Menonbdb80b02013-08-12 17:45:54 -07006007 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006008
Arun Menon906de572013-06-18 17:01:40 -07006009 if (m_state == OMX_StateInvalid) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006010 DEBUG_PRINT_ERROR("FTB in Invalid State");
Arun Menon906de572013-06-18 17:01:40 -07006011 return OMX_ErrorInvalidState;
6012 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006013
Arun Menon906de572013-06-18 17:01:40 -07006014 if (!m_out_bEnabled) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006015 DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
Arun Menon906de572013-06-18 17:01:40 -07006016 return OMX_ErrorIncorrectStateOperation;
6017 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006018
Jia Meng2d51b932014-07-10 14:02:54 +08006019 nPortIndex = buffer - client_buffers.get_il_buf_hdr();
Arun Menon906de572013-06-18 17:01:40 -07006020 if (buffer == NULL ||
Jia Meng2d51b932014-07-10 14:02:54 +08006021 (nPortIndex >= drv_ctx.op_buf.actualcount)) {
6022 DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
6023 nPortIndex, drv_ctx.op_buf.actualcount);
Arun Menon906de572013-06-18 17:01:40 -07006024 return OMX_ErrorBadParameter;
6025 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006026
Arun Menon906de572013-06-18 17:01:40 -07006027 if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006028 DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
Arun Menon906de572013-06-18 17:01:40 -07006029 return OMX_ErrorBadPortIndex;
6030 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006031
Arun Menon906de572013-06-18 17:01:40 -07006032 DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
6033 post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
6034 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006035}
6036/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006037 FUNCTION
6038 omx_vdec::fill_this_buffer_proxy
Shalaj Jain273b3e02012-06-22 19:08:03 -07006039
Arun Menon906de572013-06-18 17:01:40 -07006040 DESCRIPTION
6041 IL client uses this method to release the frame buffer
6042 after displaying them.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006043
Arun Menon906de572013-06-18 17:01:40 -07006044 PARAMETERS
6045 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006046
Arun Menon906de572013-06-18 17:01:40 -07006047 RETURN VALUE
6048 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07006049
Arun Menon906de572013-06-18 17:01:40 -07006050 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006051OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy(
Arun Menon906de572013-06-18 17:01:40 -07006052 OMX_IN OMX_HANDLETYPE hComp,
6053 OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
Shalaj Jain273b3e02012-06-22 19:08:03 -07006054{
Arun Menon906de572013-06-18 17:01:40 -07006055 OMX_ERRORTYPE nRet = OMX_ErrorNone;
6056 OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
6057 unsigned nPortIndex = 0;
6058 struct vdec_fillbuffer_cmd fillbuffer;
6059 struct vdec_bufferpayload *ptr_outputbuffer = NULL;
6060 struct vdec_output_frameinfo *ptr_respbuffer = NULL;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006061
Arun Menon906de572013-06-18 17:01:40 -07006062 nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
Shalaj Jain273b3e02012-06-22 19:08:03 -07006063
Jia Meng2d51b932014-07-10 14:02:54 +08006064 if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) {
6065 DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
6066 nPortIndex, drv_ctx.op_buf.actualcount);
Arun Menon906de572013-06-18 17:01:40 -07006067 return OMX_ErrorBadParameter;
Jia Meng2d51b932014-07-10 14:02:54 +08006068 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006069
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006070 DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
Arun Menon906de572013-06-18 17:01:40 -07006071 bufferAdd, bufferAdd->pBuffer);
6072 /*Return back the output buffer to client*/
6073 if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006074 DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
Arun Menon906de572013-06-18 17:01:40 -07006075 buffer->nFilledLen = 0;
6076 m_cb.FillBufferDone (hComp,m_app_data,buffer);
6077 return OMX_ErrorNone;
6078 }
Arun Menon50ab1bf2014-01-08 18:02:19 -08006079
6080 if (dynamic_buf_mode) {
6081 //map the buffer handle based on the size set on output port definition.
6082 if (!secure_mode) {
6083 drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr =
6084 (OMX_U8*)mmap(0, drv_ctx.op_buf.buffer_size,
6085 PROT_READ|PROT_WRITE, MAP_SHARED,
6086 drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0);
6087 }
6088 drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0;
6089 drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = drv_ctx.op_buf.buffer_size;
6090 drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = drv_ctx.op_buf.buffer_size;
6091 buf_ref_add(drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd,
6092 drv_ctx.ptr_outputbuffer[nPortIndex].offset);
6093 }
6094
Arun Menon906de572013-06-18 17:01:40 -07006095 pending_output_buffers++;
6096 buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
6097 ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
6098 if (ptr_respbuffer) {
6099 ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
6100 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006101
Arun Menon906de572013-06-18 17:01:40 -07006102 if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
6103 DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
6104 buffer->nFilledLen = 0;
6105 m_cb.FillBufferDone (hComp,m_app_data,buffer);
6106 pending_output_buffers--;
6107 return OMX_ErrorBadParameter;
6108 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006109
Arun Menon906de572013-06-18 17:01:40 -07006110 int rc = 0;
6111 struct v4l2_buffer buf;
6112 struct v4l2_plane plane[VIDEO_MAX_PLANES];
6113 memset( (void *)&buf, 0, sizeof(buf));
6114 memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
Arun Menon8544ead2014-05-08 17:42:29 -07006115 unsigned int extra_idx = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006116
Arun Menon906de572013-06-18 17:01:40 -07006117 buf.index = nPortIndex;
6118 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
6119 buf.memory = V4L2_MEMORY_USERPTR;
6120 plane[0].bytesused = buffer->nFilledLen;
6121 plane[0].length = drv_ctx.op_buf.buffer_size;
6122 plane[0].m.userptr =
6123 (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
6124 (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
6125 plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
6126 plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
6127 plane[0].data_offset = 0;
6128 extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
6129 if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
6130 plane[extra_idx].bytesused = 0;
6131 plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
6132 plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07006133#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07006134 plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07006135#endif
Arun Menon906de572013-06-18 17:01:40 -07006136 plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
6137 plane[extra_idx].data_offset = 0;
6138 } else if (extra_idx >= VIDEO_MAX_PLANES) {
Arun Menon8544ead2014-05-08 17:42:29 -07006139 DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
Arun Menon906de572013-06-18 17:01:40 -07006140 return OMX_ErrorBadParameter;
6141 }
6142 buf.m.planes = plane;
6143 buf.length = drv_ctx.num_planes;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006144 DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d",
Arun Menonbdb80b02013-08-12 17:45:54 -07006145 plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1]);
6146
Arun Menon906de572013-06-18 17:01:40 -07006147 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
6148 if (rc) {
6149 /*TODO: How to handle this case */
6150 DEBUG_PRINT_ERROR("Failed to qbuf to driver");
6151 }
Arun Menon906de572013-06-18 17:01:40 -07006152return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006153}
6154
6155/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006156 FUNCTION
6157 omx_vdec::SetCallbacks
Shalaj Jain273b3e02012-06-22 19:08:03 -07006158
Arun Menon906de572013-06-18 17:01:40 -07006159 DESCRIPTION
6160 Set the callbacks.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006161
Arun Menon906de572013-06-18 17:01:40 -07006162 PARAMETERS
6163 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006164
Arun Menon906de572013-06-18 17:01:40 -07006165 RETURN VALUE
6166 OMX Error None if everything successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006167
Arun Menon906de572013-06-18 17:01:40 -07006168 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006169OMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07006170 OMX_IN OMX_CALLBACKTYPE* callbacks,
6171 OMX_IN OMX_PTR appData)
Shalaj Jain273b3e02012-06-22 19:08:03 -07006172{
6173
Arun Menon906de572013-06-18 17:01:40 -07006174 m_cb = *callbacks;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006175 DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
Arun Menon906de572013-06-18 17:01:40 -07006176 m_cb.EventHandler,m_cb.FillBufferDone);
6177 m_app_data = appData;
6178 return OMX_ErrorNotImplemented;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006179}
6180
6181/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006182 FUNCTION
6183 omx_vdec::ComponentDeInit
Shalaj Jain273b3e02012-06-22 19:08:03 -07006184
Arun Menon906de572013-06-18 17:01:40 -07006185 DESCRIPTION
6186 Destroys the component and release memory allocated to the heap.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006187
Arun Menon906de572013-06-18 17:01:40 -07006188 PARAMETERS
6189 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006190
Arun Menon906de572013-06-18 17:01:40 -07006191 RETURN VALUE
6192 OMX Error None if everything successful.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006193
Arun Menon906de572013-06-18 17:01:40 -07006194 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006195OMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
6196{
6197#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -07006198 if (iDivXDrmDecrypt) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006199 delete iDivXDrmDecrypt;
6200 iDivXDrmDecrypt=NULL;
6201 }
6202#endif //_ANDROID_
6203
Shalaj Jain286b0062013-02-21 20:35:48 -08006204 unsigned i = 0;
Arun Menon906de572013-06-18 17:01:40 -07006205 if (OMX_StateLoaded != m_state) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006206 DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
Arun Menon906de572013-06-18 17:01:40 -07006207 m_state);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006208 DEBUG_PRINT_ERROR("Playback Ended - FAILED");
Arun Menon906de572013-06-18 17:01:40 -07006209 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006210 DEBUG_PRINT_HIGH("Playback Ended - PASSED");
Shalaj Jain273b3e02012-06-22 19:08:03 -07006211 }
6212
6213 /*Check if the output buffers have to be cleaned up*/
Arun Menon906de572013-06-18 17:01:40 -07006214 if (m_out_mem_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006215 DEBUG_PRINT_LOW("Freeing the Output Memory");
Arun Menon906de572013-06-18 17:01:40 -07006216 for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
6217 free_output_buffer (&m_out_mem_ptr[i]);
Shalaj Jain273b3e02012-06-22 19:08:03 -07006218 }
6219#ifdef _ANDROID_ICS_
6220 memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
6221#endif
6222 }
6223
6224 /*Check if the input buffers have to be cleaned up*/
Arun Menon906de572013-06-18 17:01:40 -07006225 if (m_inp_mem_ptr || m_inp_heap_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006226 DEBUG_PRINT_LOW("Freeing the Input Memory");
Arun Menon906de572013-06-18 17:01:40 -07006227 for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
6228 if (m_inp_mem_ptr)
6229 free_input_buffer (i,&m_inp_mem_ptr[i]);
6230 else
6231 free_input_buffer (i,NULL);
Shalaj Jain273b3e02012-06-22 19:08:03 -07006232 }
6233 }
6234 free_input_buffer_header();
6235 free_output_buffer_header();
Arun Menon906de572013-06-18 17:01:40 -07006236 if (h264_scratch.pBuffer) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006237 free(h264_scratch.pBuffer);
6238 h264_scratch.pBuffer = NULL;
6239 }
6240
Arun Menon906de572013-06-18 17:01:40 -07006241 if (h264_parser) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006242 delete h264_parser;
Arun Menon906de572013-06-18 17:01:40 -07006243 h264_parser = NULL;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006244 }
6245
Leena Winterrowddb9eaca2013-08-23 10:40:41 -07006246 if (m_frame_parser.mutils) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006247 DEBUG_PRINT_LOW("Free utils parser");
Leena Winterrowddb9eaca2013-08-23 10:40:41 -07006248 delete (m_frame_parser.mutils);
6249 m_frame_parser.mutils = NULL;
6250 }
6251
Arun Menon906de572013-06-18 17:01:40 -07006252 if (m_platform_list) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006253 free(m_platform_list);
6254 m_platform_list = NULL;
6255 }
Arun Menon906de572013-06-18 17:01:40 -07006256 if (m_vendor_config.pData) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006257 free(m_vendor_config.pData);
6258 m_vendor_config.pData = NULL;
6259 }
6260
6261 // Reset counters in mesg queues
6262 m_ftb_q.m_size=0;
6263 m_cmd_q.m_size=0;
6264 m_etb_q.m_size=0;
6265 m_ftb_q.m_read = m_ftb_q.m_write =0;
6266 m_cmd_q.m_read = m_cmd_q.m_write =0;
6267 m_etb_q.m_read = m_etb_q.m_write =0;
6268#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -07006269 if (m_debug_timestamp) {
6270 m_timestamp_list.reset_ts_list();
Shalaj Jain273b3e02012-06-22 19:08:03 -07006271 }
6272#endif
6273
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006274 DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
Shalaj Jain273b3e02012-06-22 19:08:03 -07006275 //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
Arun Menon906de572013-06-18 17:01:40 -07006276 // NULL);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006277 DEBUG_PRINT_HIGH("Close the driver instance");
Arun Menon906de572013-06-18 17:01:40 -07006278
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07006279 if (m_debug.infile) {
6280 fclose(m_debug.infile);
6281 m_debug.infile = NULL;
6282 }
6283 if (m_debug.outfile) {
6284 fclose(m_debug.outfile);
6285 m_debug.outfile = NULL;
6286 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006287#ifdef OUTPUT_EXTRADATA_LOG
Shalaj Jainaf08f302013-03-18 13:15:35 -07006288 if (outputExtradataFile)
6289 fclose (outputExtradataFile);
Shalaj Jain273b3e02012-06-22 19:08:03 -07006290#endif
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006291 DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete");
Arun Menon906de572013-06-18 17:01:40 -07006292 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006293}
6294
6295/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006296 FUNCTION
6297 omx_vdec::UseEGLImage
Shalaj Jain273b3e02012-06-22 19:08:03 -07006298
Arun Menon906de572013-06-18 17:01:40 -07006299 DESCRIPTION
6300 OMX Use EGL Image method implementation <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006301
Arun Menon906de572013-06-18 17:01:40 -07006302 PARAMETERS
6303 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006304
Arun Menon906de572013-06-18 17:01:40 -07006305 RETURN VALUE
6306 Not Implemented error.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006307
Arun Menon906de572013-06-18 17:01:40 -07006308 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006309OMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07006310 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
6311 OMX_IN OMX_U32 port,
6312 OMX_IN OMX_PTR appData,
6313 OMX_IN void* eglImage)
Shalaj Jain273b3e02012-06-22 19:08:03 -07006314{
Arun Menon906de572013-06-18 17:01:40 -07006315 OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
6316 OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
6317 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006318
6319#ifdef USE_EGL_IMAGE_GPU
Arun Menon906de572013-06-18 17:01:40 -07006320 PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
6321 EGLint fd = -1, offset = 0,pmemPtr = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006322#else
Arun Menon906de572013-06-18 17:01:40 -07006323 int fd = -1, offset = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006324#endif
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006325 DEBUG_PRINT_HIGH("use EGL image support for decoder");
Arun Menon906de572013-06-18 17:01:40 -07006326 if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006327 DEBUG_PRINT_ERROR("");
Arun Menon906de572013-06-18 17:01:40 -07006328 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006329#ifdef USE_EGL_IMAGE_GPU
Arun Menon906de572013-06-18 17:01:40 -07006330 if (m_display_id == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006331 DEBUG_PRINT_ERROR("Display ID is not set by IL client");
Shalaj Jain273b3e02012-06-22 19:08:03 -07006332 return OMX_ErrorInsufficientResources;
Arun Menon906de572013-06-18 17:01:40 -07006333 }
6334 egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
6335 eglGetProcAddress("eglQueryImageKHR");
6336 egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
6337 egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
6338 egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
Shalaj Jain273b3e02012-06-22 19:08:03 -07006339#else //with OMX test app
6340 struct temp_egl {
6341 int pmem_fd;
6342 int offset;
6343 };
6344 struct temp_egl *temp_egl_id = NULL;
6345 void * pmemPtr = (void *) eglImage;
6346 temp_egl_id = (struct temp_egl *)eglImage;
Arun Menon906de572013-06-18 17:01:40 -07006347 if (temp_egl_id != NULL) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006348 fd = temp_egl_id->pmem_fd;
6349 offset = temp_egl_id->offset;
6350 }
6351#endif
6352 if (fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006353 DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
Shalaj Jain273b3e02012-06-22 19:08:03 -07006354 return OMX_ErrorInsufficientResources;
Arun Menon906de572013-06-18 17:01:40 -07006355 }
6356 pmem_info.pmem_fd = (OMX_U32) fd;
6357 pmem_info.offset = (OMX_U32) offset;
6358 pmem_entry.entry = (void *) &pmem_info;
6359 pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
6360 pmem_list.entryList = &pmem_entry;
6361 pmem_list.nEntries = 1;
6362 ouput_egl_buffers = true;
6363 if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
6364 (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
6365 (OMX_U8 *)pmemPtr)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006366 DEBUG_PRINT_ERROR("use buffer call failed for egl image");
Arun Menon906de572013-06-18 17:01:40 -07006367 return OMX_ErrorInsufficientResources;
6368 }
6369 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006370}
6371
6372/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006373 FUNCTION
6374 omx_vdec::ComponentRoleEnum
Shalaj Jain273b3e02012-06-22 19:08:03 -07006375
Arun Menon906de572013-06-18 17:01:40 -07006376 DESCRIPTION
6377 OMX Component Role Enum method implementation.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006378
Arun Menon906de572013-06-18 17:01:40 -07006379 PARAMETERS
6380 <TBD>.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006381
Arun Menon906de572013-06-18 17:01:40 -07006382 RETURN VALUE
6383 OMX Error None if everything is successful.
6384 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006385OMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07006386 OMX_OUT OMX_U8* role,
6387 OMX_IN OMX_U32 index)
Shalaj Jain273b3e02012-06-22 19:08:03 -07006388{
Arun Menon906de572013-06-18 17:01:40 -07006389 OMX_ERRORTYPE eRet = OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006390
Arun Menon906de572013-06-18 17:01:40 -07006391 if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
6392 if ((0 == index) && role) {
6393 strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006394 DEBUG_PRINT_LOW("component_role_enum: role %s",role);
Arun Menon906de572013-06-18 17:01:40 -07006395 } else {
6396 eRet = OMX_ErrorNoMore;
6397 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006398 }
Arun Menon906de572013-06-18 17:01:40 -07006399 if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
6400 if ((0 == index) && role) {
6401 strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006402 DEBUG_PRINT_LOW("component_role_enum: role %s",role);
Arun Menon906de572013-06-18 17:01:40 -07006403 } else {
6404 eRet = OMX_ErrorNoMore;
6405 }
6406 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
6407 if ((0 == index) && role) {
6408 strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006409 DEBUG_PRINT_LOW("component_role_enum: role %s",role);
Arun Menon906de572013-06-18 17:01:40 -07006410 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006411 DEBUG_PRINT_LOW("No more roles");
Arun Menon906de572013-06-18 17:01:40 -07006412 eRet = OMX_ErrorNoMore;
6413 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006414 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006415
Arun Menon906de572013-06-18 17:01:40 -07006416 else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
6417 (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
6418 )
Shalaj Jain273b3e02012-06-22 19:08:03 -07006419
Shalaj Jain273b3e02012-06-22 19:08:03 -07006420 {
Arun Menon906de572013-06-18 17:01:40 -07006421 if ((0 == index) && role) {
6422 strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006423 DEBUG_PRINT_LOW("component_role_enum: role %s",role);
Arun Menon906de572013-06-18 17:01:40 -07006424 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006425 DEBUG_PRINT_LOW("No more roles");
Arun Menon906de572013-06-18 17:01:40 -07006426 eRet = OMX_ErrorNoMore;
6427 }
6428 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
6429 if ((0 == index) && role) {
6430 strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006431 DEBUG_PRINT_LOW("component_role_enum: role %s",role);
Arun Menon906de572013-06-18 17:01:40 -07006432 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006433 DEBUG_PRINT_LOW("No more roles");
Arun Menon906de572013-06-18 17:01:40 -07006434 eRet = OMX_ErrorNoMore;
6435 }
6436 } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
6437 (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
6438 ) {
6439 if ((0 == index) && role) {
6440 strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006441 DEBUG_PRINT_LOW("component_role_enum: role %s",role);
Arun Menon906de572013-06-18 17:01:40 -07006442 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006443 DEBUG_PRINT_LOW("No more roles");
Arun Menon906de572013-06-18 17:01:40 -07006444 eRet = OMX_ErrorNoMore;
6445 }
6446 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
6447 if ((0 == index) && role) {
6448 strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006449 DEBUG_PRINT_LOW("component_role_enum: role %s",role);
Arun Menon906de572013-06-18 17:01:40 -07006450 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006451 DEBUG_PRINT_LOW("No more roles");
Arun Menon906de572013-06-18 17:01:40 -07006452 eRet = OMX_ErrorNoMore;
6453 }
6454 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006455 DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
Arun Menon906de572013-06-18 17:01:40 -07006456 eRet = OMX_ErrorInvalidComponentName;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006457 }
Arun Menon906de572013-06-18 17:01:40 -07006458 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006459}
6460
6461
6462
6463
6464/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006465 FUNCTION
6466 omx_vdec::AllocateDone
Shalaj Jain273b3e02012-06-22 19:08:03 -07006467
Arun Menon906de572013-06-18 17:01:40 -07006468 DESCRIPTION
6469 Checks if entire buffer pool is allocated by IL Client or not.
6470 Need this to move to IDLE state.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006471
Arun Menon906de572013-06-18 17:01:40 -07006472 PARAMETERS
6473 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006474
Arun Menon906de572013-06-18 17:01:40 -07006475 RETURN VALUE
6476 true/false.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006477
Arun Menon906de572013-06-18 17:01:40 -07006478 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006479bool omx_vdec::allocate_done(void)
6480{
Arun Menon906de572013-06-18 17:01:40 -07006481 bool bRet = false;
6482 bool bRet_In = false;
6483 bool bRet_Out = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006484
Arun Menon906de572013-06-18 17:01:40 -07006485 bRet_In = allocate_input_done();
6486 bRet_Out = allocate_output_done();
Shalaj Jain273b3e02012-06-22 19:08:03 -07006487
Arun Menon906de572013-06-18 17:01:40 -07006488 if (bRet_In && bRet_Out) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006489 bRet = true;
6490 }
Arun Menon906de572013-06-18 17:01:40 -07006491
6492 return bRet;
6493}
6494/* ======================================================================
6495 FUNCTION
6496 omx_vdec::AllocateInputDone
6497
6498 DESCRIPTION
6499 Checks if I/P buffer pool is allocated by IL Client or not.
6500
6501 PARAMETERS
6502 None.
6503
6504 RETURN VALUE
6505 true/false.
6506
6507 ========================================================================== */
6508bool omx_vdec::allocate_input_done(void)
6509{
6510 bool bRet = false;
6511 unsigned i=0;
6512
6513 if (m_inp_mem_ptr == NULL) {
6514 return bRet;
6515 }
6516 if (m_inp_mem_ptr ) {
6517 for (; i<drv_ctx.ip_buf.actualcount; i++) {
6518 if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
6519 break;
6520 }
6521 }
6522 }
6523 if (i == drv_ctx.ip_buf.actualcount) {
6524 bRet = true;
6525 DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
6526 }
6527 if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
6528 m_inp_bPopulated = OMX_TRUE;
6529 }
6530 return bRet;
6531}
6532/* ======================================================================
6533 FUNCTION
6534 omx_vdec::AllocateOutputDone
6535
6536 DESCRIPTION
6537 Checks if entire O/P buffer pool is allocated by IL Client or not.
6538
6539 PARAMETERS
6540 None.
6541
6542 RETURN VALUE
6543 true/false.
6544
6545 ========================================================================== */
6546bool omx_vdec::allocate_output_done(void)
6547{
6548 bool bRet = false;
6549 unsigned j=0;
6550
6551 if (m_out_mem_ptr == NULL) {
6552 return bRet;
6553 }
6554
6555 if (m_out_mem_ptr) {
6556 for (; j < drv_ctx.op_buf.actualcount; j++) {
6557 if (BITMASK_ABSENT(&m_out_bm_count,j)) {
6558 break;
6559 }
6560 }
6561 }
6562
6563 if (j == drv_ctx.op_buf.actualcount) {
6564 bRet = true;
6565 DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
6566 if (m_out_bEnabled)
6567 m_out_bPopulated = OMX_TRUE;
6568 }
6569
6570 return bRet;
6571}
6572
6573/* ======================================================================
6574 FUNCTION
6575 omx_vdec::ReleaseDone
6576
6577 DESCRIPTION
6578 Checks if IL client has released all the buffers.
6579
6580 PARAMETERS
6581 None.
6582
6583 RETURN VALUE
6584 true/false
6585
6586 ========================================================================== */
6587bool omx_vdec::release_done(void)
6588{
6589 bool bRet = false;
6590
6591 if (release_input_done()) {
6592 if (release_output_done()) {
6593 bRet = true;
6594 }
6595 }
6596 return bRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006597}
6598
6599
6600/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006601 FUNCTION
6602 omx_vdec::ReleaseOutputDone
Shalaj Jain273b3e02012-06-22 19:08:03 -07006603
Arun Menon906de572013-06-18 17:01:40 -07006604 DESCRIPTION
6605 Checks if IL client has released all the buffers.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006606
Arun Menon906de572013-06-18 17:01:40 -07006607 PARAMETERS
6608 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006609
Arun Menon906de572013-06-18 17:01:40 -07006610 RETURN VALUE
6611 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07006612
Arun Menon906de572013-06-18 17:01:40 -07006613 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006614bool omx_vdec::release_output_done(void)
6615{
Arun Menon906de572013-06-18 17:01:40 -07006616 bool bRet = false;
6617 unsigned i=0,j=0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006618
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006619 DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr);
Arun Menon906de572013-06-18 17:01:40 -07006620 if (m_out_mem_ptr) {
6621 for (; j < drv_ctx.op_buf.actualcount ; j++) {
6622 if (BITMASK_PRESENT(&m_out_bm_count,j)) {
6623 break;
6624 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006625 }
Arun Menon906de572013-06-18 17:01:40 -07006626 if (j == drv_ctx.op_buf.actualcount) {
6627 m_out_bm_count = 0;
6628 bRet = true;
6629 }
6630 } else {
6631 m_out_bm_count = 0;
6632 bRet = true;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006633 }
Arun Menon906de572013-06-18 17:01:40 -07006634 return bRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006635}
6636/* ======================================================================
Arun Menon906de572013-06-18 17:01:40 -07006637 FUNCTION
6638 omx_vdec::ReleaseInputDone
Shalaj Jain273b3e02012-06-22 19:08:03 -07006639
Arun Menon906de572013-06-18 17:01:40 -07006640 DESCRIPTION
6641 Checks if IL client has released all the buffers.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006642
Arun Menon906de572013-06-18 17:01:40 -07006643 PARAMETERS
6644 None.
Shalaj Jain273b3e02012-06-22 19:08:03 -07006645
Arun Menon906de572013-06-18 17:01:40 -07006646 RETURN VALUE
6647 true/false
Shalaj Jain273b3e02012-06-22 19:08:03 -07006648
Arun Menon906de572013-06-18 17:01:40 -07006649 ========================================================================== */
Shalaj Jain273b3e02012-06-22 19:08:03 -07006650bool omx_vdec::release_input_done(void)
6651{
Arun Menon906de572013-06-18 17:01:40 -07006652 bool bRet = false;
6653 unsigned i=0,j=0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006654
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006655 DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
Arun Menon906de572013-06-18 17:01:40 -07006656 if (m_inp_mem_ptr) {
6657 for (; j<drv_ctx.ip_buf.actualcount; j++) {
6658 if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
6659 break;
6660 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006661 }
Arun Menon906de572013-06-18 17:01:40 -07006662 if (j==drv_ctx.ip_buf.actualcount) {
6663 bRet = true;
6664 }
6665 } else {
6666 bRet = true;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006667 }
Arun Menon906de572013-06-18 17:01:40 -07006668 return bRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006669}
6670
6671OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07006672 OMX_BUFFERHEADERTYPE * buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07006673{
Arun Menon906de572013-06-18 17:01:40 -07006674 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
Surajit Podderd2644d52013-08-28 17:59:06 +05306675 if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006676 DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
Arun Menon906de572013-06-18 17:01:40 -07006677 return OMX_ErrorBadParameter;
6678 } else if (output_flush_progress) {
6679 DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
6680 buffer->nFilledLen = 0;
6681 buffer->nTimeStamp = 0;
6682 buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
6683 buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6684 buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
Praneeth Paladugu594e6822013-04-19 10:47:28 -07006685 }
6686
Arun Menon906de572013-06-18 17:01:40 -07006687 if (m_debug_extradata) {
6688 if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006689 DEBUG_PRINT_HIGH("");
6690 DEBUG_PRINT_HIGH("***************************************************");
6691 DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received");
6692 DEBUG_PRINT_HIGH("***************************************************");
Arun Menon906de572013-06-18 17:01:40 -07006693 }
6694
6695 if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006696 DEBUG_PRINT_HIGH("");
6697 DEBUG_PRINT_HIGH("***************************************************");
6698 DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
6699 DEBUG_PRINT_HIGH("***************************************************");
Arun Menon906de572013-06-18 17:01:40 -07006700 }
Praneeth Paladugu594e6822013-04-19 10:47:28 -07006701 }
Praneeth Paladugu594e6822013-04-19 10:47:28 -07006702
6703
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006704 DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
Arun Menon906de572013-06-18 17:01:40 -07006705 buffer, buffer->pBuffer);
6706 pending_output_buffers --;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006707
Arun Menon906de572013-06-18 17:01:40 -07006708 if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006709 DEBUG_PRINT_HIGH("Output EOS has been reached");
Arun Menon906de572013-06-18 17:01:40 -07006710 if (!output_flush_progress)
6711 post_event((unsigned)NULL, (unsigned)NULL,
6712 OMX_COMPONENT_GENERATE_EOS_DONE);
6713
6714 if (psource_frame) {
6715 m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
6716 psource_frame = NULL;
6717 }
6718 if (pdest_frame) {
6719 pdest_frame->nFilledLen = 0;
6720 m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
6721 (unsigned)NULL);
6722 pdest_frame = NULL;
6723 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006724 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006725
Shalaj Jain273b3e02012-06-22 19:08:03 -07006726
Praneeth Paladugudd29c282013-09-12 15:41:47 -07006727 if (!output_flush_progress && (buffer->nFilledLen > 0)) {
6728 DEBUG_PRINT_LOW("Processing extradata");
6729 handle_extradata(buffer);
6730 }
6731
Arun Menon906de572013-06-18 17:01:40 -07006732 /* For use buffer we need to copy the data */
6733 if (!output_flush_progress) {
6734 /* This is the error check for non-recoverable errros */
6735 bool is_duplicate_ts_valid = true;
6736 bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
Deva Ramasubramaniane47e05b2013-04-24 15:23:29 -07006737
Arun Menon906de572013-06-18 17:01:40 -07006738 if (output_capability == V4L2_PIX_FMT_MPEG4 ||
6739 output_capability == V4L2_PIX_FMT_MPEG2 ||
6740 output_capability == V4L2_PIX_FMT_DIVX ||
6741 output_capability == V4L2_PIX_FMT_DIVX_311)
6742 is_duplicate_ts_valid = false;
Deva Ramasubramaniane47e05b2013-04-24 15:23:29 -07006743
Arun Menon906de572013-06-18 17:01:40 -07006744 if (output_capability == V4L2_PIX_FMT_H264 && is_interlaced) {
Arun Menon7b6fd642014-02-13 16:48:36 -08006745 if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) {
Arun Menon906de572013-06-18 17:01:40 -07006746 is_interlaced = false;
Rajeshwar Kurapaty46a24f02013-07-09 15:13:41 +05306747 }
Arun Menon906de572013-06-18 17:01:40 -07006748 }
Rajeshwar Kurapaty46a24f02013-07-09 15:13:41 +05306749
Arun Menon906de572013-06-18 17:01:40 -07006750 if (buffer->nFilledLen > 0) {
6751 time_stamp_dts.get_next_timestamp(buffer,
6752 is_interlaced && is_duplicate_ts_valid);
6753 if (m_debug_timestamp) {
6754 {
6755 OMX_TICKS expected_ts = 0;
6756 m_timestamp_list.pop_min_ts(expected_ts);
6757 if (is_interlaced && is_duplicate_ts_valid) {
6758 m_timestamp_list.pop_min_ts(expected_ts);
6759 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006760 DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
Arun Menon906de572013-06-18 17:01:40 -07006761 buffer->nTimeStamp, expected_ts);
6762
6763 if (buffer->nTimeStamp != expected_ts) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006764 DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
Arun Menon906de572013-06-18 17:01:40 -07006765 }
6766 }
Rajeshwar Kurapaty46a24f02013-07-09 15:13:41 +05306767 }
Arun Menon906de572013-06-18 17:01:40 -07006768 } else {
Arun Menon906de572013-06-18 17:01:40 -07006769 time_stamp_dts.remove_time_stamp(
6770 buffer->nTimeStamp,
6771 is_interlaced && is_duplicate_ts_valid);
Rajeshwar Kurapaty46a24f02013-07-09 15:13:41 +05306772 }
Arun Menon906de572013-06-18 17:01:40 -07006773
6774
Praneeth Paladugu8f12e822013-03-11 18:47:58 -07006775 }
Deva Ramasubramanian9ba5d832014-01-03 18:32:50 -08006776
Deva Ramasubramaniancdbd31b2014-04-14 20:14:28 -07006777 /* Since we're passing around handles, adjust nFilledLen and nAllocLen
6778 * to size of the handle. Do it _after_ handle_extradata() which
6779 * requires the respective sizes to be accurate. */
6780 if (dynamic_buf_mode) {
6781 buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
6782 buffer->nFilledLen = buffer->nFilledLen ?
6783 sizeof(struct VideoDecoderOutputMetaData) : 0;
6784 }
6785
Arun Menon906de572013-06-18 17:01:40 -07006786 if (m_cb.FillBufferDone) {
6787 if (buffer->nFilledLen > 0) {
Deva Ramasubramanian9ba5d832014-01-03 18:32:50 -08006788 if (arbitrary_bytes)
Arun Menon906de572013-06-18 17:01:40 -07006789 adjust_timestamp(buffer->nTimeStamp);
Deva Ramasubramanian9ba5d832014-01-03 18:32:50 -08006790 else
6791 set_frame_rate(buffer->nTimeStamp);
6792
Arun Menon906de572013-06-18 17:01:40 -07006793 if (perf_flag) {
6794 if (!proc_frms) {
6795 dec_time.stop();
6796 latency = dec_time.processing_time_us() - latency;
6797 DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
6798 dec_time.start();
6799 fps_metrics.start();
6800 }
6801 proc_frms++;
6802 if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
6803 OMX_U64 proc_time = 0;
6804 fps_metrics.stop();
6805 proc_time = fps_metrics.processing_time_us();
6806 DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
Shalaj Jain273b3e02012-06-22 19:08:03 -07006807 proc_frms, (float)proc_time / 1e6,
6808 (float)(1e6 * proc_frms) / proc_time);
Arun Menon906de572013-06-18 17:01:40 -07006809 proc_frms = 0;
6810 }
6811 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006812
6813#ifdef OUTPUT_EXTRADATA_LOG
Arun Menon906de572013-06-18 17:01:40 -07006814 if (outputExtradataFile) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006815
Arun Menon906de572013-06-18 17:01:40 -07006816 OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
6817 p_extra = (OMX_OTHER_EXTRADATATYPE *)
6818 ((unsigned)(buffer->pBuffer + buffer->nOffset +
6819 buffer->nFilledLen + 3)&(~3));
6820 while (p_extra &&
6821 (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006822 DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
Arun Menon906de572013-06-18 17:01:40 -07006823 fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
6824 if (p_extra->eType == OMX_ExtraDataNone) {
6825 break;
6826 }
6827 p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
6828 }
6829 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006830#endif
Arun Menon906de572013-06-18 17:01:40 -07006831 }
6832 if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
6833 prev_ts = LLONG_MAX;
6834 rst_prev_ts = true;
6835 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006836
Arun Menon906de572013-06-18 17:01:40 -07006837 pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
6838 ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
6839 buffer->pPlatformPrivate)->entryList->entry;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006840 DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
Arun Menon906de572013-06-18 17:01:40 -07006841 OMX_BUFFERHEADERTYPE *il_buffer;
6842 il_buffer = client_buffers.get_il_buf_hdr(buffer);
vivek mehtaa75c69f2014-01-10 21:50:37 -08006843
vivek mehta79cff222014-01-22 12:17:07 -08006844 if (il_buffer && m_last_rendered_TS >= 0) {
6845 int current_framerate = (int)(drv_ctx.frame_rate.fps_numerator /drv_ctx.frame_rate.fps_denominator);
Manikanta Kanamarlapudifb53b262014-01-20 16:12:47 +05306846 OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS);
vivek mehta79cff222014-01-22 12:17:07 -08006847
6848 // Current frame can be send for rendering if
6849 // (a) current FPS is <= 60
6850 // (b) is the next frame after the frame with TS 0
6851 // (c) is the first frame after seek
6852 // (d) the delta TS b\w two consecutive frames is > 16 ms
6853 // (e) its TS is equal to previous frame TS
6854 // (f) if marked EOS
6855
6856 if(current_framerate <= 60 || m_last_rendered_TS == 0 ||
6857 il_buffer->nTimeStamp == 0 || ts_delta >= 16000 ||
6858 ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
vivek mehtaa75c69f2014-01-10 21:50:37 -08006859 m_last_rendered_TS = il_buffer->nTimeStamp;
vivek mehta79cff222014-01-22 12:17:07 -08006860 } else {
vivek mehtaa75c69f2014-01-10 21:50:37 -08006861 //mark for droping
vivek mehtaa75c69f2014-01-10 21:50:37 -08006862 buffer->nFilledLen = 0;
vivek mehta79cff222014-01-22 12:17:07 -08006863 }
6864
6865 DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%d)",
6866 buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS,
6867 il_buffer->nTimeStamp,ts_delta);
vivek mehtaa75c69f2014-01-10 21:50:37 -08006868 }
6869
vivek mehta79cff222014-01-22 12:17:07 -08006870 if (il_buffer) {
Arun Menon9230eb82014-02-11 19:19:02 -08006871 log_output_buffers(il_buffer);
6872 if (dynamic_buf_mode) {
6873 unsigned int nPortIndex = 0;
6874 nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
6875
6876 if (!secure_mode) {
6877 munmap(drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr,
6878 drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size);
6879 }
6880
6881 //Clear graphic buffer handles in dynamic mode
6882 native_buffer[nPortIndex].privatehandle = NULL;
6883 native_buffer[nPortIndex].nativehandle = NULL;
6884 }
Arun Menon906de572013-06-18 17:01:40 -07006885 m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
vivek mehta79cff222014-01-22 12:17:07 -08006886 } else {
Arun Menon906de572013-06-18 17:01:40 -07006887 DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
6888 return OMX_ErrorBadParameter;
6889 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006890 DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
Arun Menon906de572013-06-18 17:01:40 -07006891 } else {
6892 return OMX_ErrorBadParameter;
Vinay Kaliada4f4422013-01-09 10:45:03 -08006893 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006894
Praveen Chavancf924182013-12-06 23:16:23 -08006895#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
Pushkaraj Patil8f98adf2014-02-12 13:32:00 +05306896 if (m_smoothstreaming_mode && m_out_mem_ptr) {
Praveen Chavancf924182013-12-06 23:16:23 -08006897 OMX_U32 buf_index = buffer - m_out_mem_ptr;
6898 BufferDim_t dim;
Pushkaraj Patil8f98adf2014-02-12 13:32:00 +05306899 private_handle_t *private_handle = NULL;
Pushkaraj Patil065b5732014-11-26 11:08:02 +05306900 dim.sliceWidth = framesize.nWidth;
6901 dim.sliceHeight = framesize.nHeight;
Pushkaraj Patil8f98adf2014-02-12 13:32:00 +05306902 if (native_buffer[buf_index].privatehandle)
6903 private_handle = native_buffer[buf_index].privatehandle;
Praveen Chavancf924182013-12-06 23:16:23 -08006904 if (private_handle) {
6905 DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d",
6906 dim.sliceWidth, dim.sliceHeight);
6907 setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim);
6908 }
6909 }
6910#endif
6911
Arun Menon906de572013-06-18 17:01:40 -07006912 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006913}
6914
6915OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07006916 OMX_BUFFERHEADERTYPE* buffer)
Shalaj Jain273b3e02012-06-22 19:08:03 -07006917{
6918
Surajit Podderd2644d52013-08-28 17:59:06 +05306919 if (buffer == NULL || ((buffer - m_inp_mem_ptr) > (int)drv_ctx.ip_buf.actualcount)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006920 DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
Arun Menon906de572013-06-18 17:01:40 -07006921 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006922 }
6923
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006924 DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
Arun Menon906de572013-06-18 17:01:40 -07006925 buffer, buffer->pBuffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -07006926 pending_input_buffers--;
6927
Arun Menon906de572013-06-18 17:01:40 -07006928 if (arbitrary_bytes) {
6929 if (pdest_frame == NULL && input_flush_progress == false) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006930 DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
Arun Menon906de572013-06-18 17:01:40 -07006931 pdest_frame = buffer;
6932 buffer->nFilledLen = 0;
6933 buffer->nTimeStamp = LLONG_MAX;
6934 push_input_buffer (hComp);
6935 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006936 DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
Arun Menon906de572013-06-18 17:01:40 -07006937 buffer->nFilledLen = 0;
6938 if (!m_input_free_q.insert_entry((unsigned)buffer,
6939 (unsigned)NULL, (unsigned)NULL)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006940 DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
Arun Menon906de572013-06-18 17:01:40 -07006941 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07006942 }
Arun Menon906de572013-06-18 17:01:40 -07006943 } else if (m_cb.EmptyBufferDone) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006944 buffer->nFilledLen = 0;
Arun Menon906de572013-06-18 17:01:40 -07006945 if (input_use_buffer == true) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006946 buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6947 }
6948 m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6949 }
6950 return OMX_ErrorNone;
6951}
6952
Shalaj Jain273b3e02012-06-22 19:08:03 -07006953int omx_vdec::async_message_process (void *context, void* message)
6954{
Arun Menon906de572013-06-18 17:01:40 -07006955 omx_vdec* omx = NULL;
6956 struct vdec_msginfo *vdec_msg = NULL;
6957 OMX_BUFFERHEADERTYPE* omxhdr = NULL;
6958 struct v4l2_buffer *v4l2_buf_ptr = NULL;
6959 struct vdec_output_frameinfo *output_respbuf = NULL;
6960 int rc=1;
6961 if (context == NULL || message == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07006962 DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
Arun Menon906de572013-06-18 17:01:40 -07006963 return -1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006964 }
Arun Menon906de572013-06-18 17:01:40 -07006965 vdec_msg = (struct vdec_msginfo *)message;
Shalaj Jain273b3e02012-06-22 19:08:03 -07006966
Arun Menon906de572013-06-18 17:01:40 -07006967 omx = reinterpret_cast<omx_vdec*>(context);
Vinay Kaliab9e98102013-04-02 19:31:43 -07006968
Arun Menon906de572013-06-18 17:01:40 -07006969 switch (vdec_msg->msgcode) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07006970
Arun Menon906de572013-06-18 17:01:40 -07006971 case VDEC_MSG_EVT_HW_ERROR:
6972 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
6973 OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6974 break;
6975
Deepak Verma24720fb2014-01-29 16:57:40 +05306976 case VDEC_MSG_EVT_HW_OVERLOAD:
6977 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
6978 OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD);
6979 break;
6980
Arun Menon906de572013-06-18 17:01:40 -07006981 case VDEC_MSG_RESP_START_DONE:
6982 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
6983 OMX_COMPONENT_GENERATE_START_DONE);
6984 break;
6985
6986 case VDEC_MSG_RESP_STOP_DONE:
6987 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
6988 OMX_COMPONENT_GENERATE_STOP_DONE);
6989 break;
6990
6991 case VDEC_MSG_RESP_RESUME_DONE:
6992 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
6993 OMX_COMPONENT_GENERATE_RESUME_DONE);
6994 break;
6995
6996 case VDEC_MSG_RESP_PAUSE_DONE:
6997 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
6998 OMX_COMPONENT_GENERATE_PAUSE_DONE);
6999 break;
7000
7001 case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
7002 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
7003 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
7004 break;
7005 case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
7006 omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
7007 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
7008 break;
7009 case VDEC_MSG_RESP_INPUT_FLUSHED:
7010 case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
7011
7012 /* omxhdr = (OMX_BUFFERHEADERTYPE* )
7013 vdec_msg->msgdata.input_frame_clientdata; */
7014
7015 v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
7016 omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
7017 if (omxhdr == NULL ||
Surajit Podderd2644d52013-08-28 17:59:06 +05307018 ((omxhdr - omx->m_inp_mem_ptr) > (int)omx->drv_ctx.ip_buf.actualcount) ) {
Arun Menon906de572013-06-18 17:01:40 -07007019 omxhdr = NULL;
7020 vdec_msg->status_code = VDEC_S_EFATAL;
7021 }
7022 if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
7023 DEBUG_PRINT_HIGH("Unsupported input");
7024 omx->omx_report_error ();
7025 }
7026 if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
7027 vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
7028 }
Pushkaraj Patil673f14a2014-12-03 14:55:19 +05307029 if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
7030 int pending_flush_waiters;
7031
7032 while (pending_flush_waiters = INT_MAX,
7033 sem_getvalue(&omx->m_safe_flush, &pending_flush_waiters),
7034 /* 0 == there /are/ waiters depending on POSIX implementation */
7035 pending_flush_waiters <= 0 ) {
7036 DEBUG_PRINT_LOW("sem post for %d EBD of CODEC CONFIG buffer",
7037 omx->m_queued_codec_config_count);
7038 sem_post(&omx->m_safe_flush);
7039 }
Pushkaraj Patil20bd6bf2014-12-22 19:33:08 +05307040 DEBUG_PRINT_LOW("Reset codec_config buffer counter");
Pushkaraj Patil673f14a2014-12-03 14:55:19 +05307041 android_atomic_and(0, &omx->m_queued_codec_config_count); /* no clearer way to set to 0 */
7042 }
7043
Arun Menon906de572013-06-18 17:01:40 -07007044 omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
7045 OMX_COMPONENT_GENERATE_EBD);
7046 break;
7047 case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
7048 int64_t *timestamp;
7049 timestamp = (int64_t *) malloc(sizeof(int64_t));
7050 if (timestamp) {
7051 *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
7052 omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
7053 OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007054 DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
Arun Menon906de572013-06-18 17:01:40 -07007055 vdec_msg->msgdata.output_frame.time_stamp);
7056 }
7057 break;
7058 case VDEC_MSG_RESP_OUTPUT_FLUSHED:
7059 case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
7060
7061 v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
7062 omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307063
7064 DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x) FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)",
Arun Menon906de572013-06-18 17:01:40 -07007065 omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307066 vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags,
7067 (unsigned int)vdec_msg->msgdata.output_frame.len,
7068 vdec_msg->msgdata.output_frame.framesize.left,
7069 vdec_msg->msgdata.output_frame.framesize.top,
7070 vdec_msg->msgdata.output_frame.framesize.right,
7071 vdec_msg->msgdata.output_frame.framesize.bottom);
Arun Menon906de572013-06-18 17:01:40 -07007072
7073 if (omxhdr && omxhdr->pOutputPortPrivate &&
Surajit Podderd2644d52013-08-28 17:59:06 +05307074 ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) &&
Arun Menon906de572013-06-18 17:01:40 -07007075 (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
Surajit Podderd2644d52013-08-28 17:59:06 +05307076 - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) {
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307077
Deva Ramasubramaniancdbd31b2014-04-14 20:14:28 -07007078 if (vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) {
Arun Menon906de572013-06-18 17:01:40 -07007079 omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
7080 omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
7081 omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
7082 omxhdr->nFlags = 0;
7083
Deva Ramasubramanianc1c7c122013-09-10 21:50:43 -07007084 if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
Arun Menon906de572013-06-18 17:01:40 -07007085 omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
7086 //rc = -1;
7087 }
7088 if (omxhdr->nFilledLen) {
7089 omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
7090 }
7091 if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
7092 omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
7093 } else {
7094 omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
7095 }
7096 if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
7097 omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
7098 }
7099 if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
7100 omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
7101 }
Arun Menon7b6fd642014-02-13 16:48:36 -08007102
7103 if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) {
7104 omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF;
7105 }
7106
Arun Menonbdb80b02013-08-12 17:45:54 -07007107 if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) {
Arun Menone50f6ef2013-09-30 15:08:27 -07007108 omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY;
Arun Menonbdb80b02013-08-12 17:45:54 -07007109 DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d",
7110 omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd);
7111 }
Arun Menonbdb80b02013-08-12 17:45:54 -07007112 if (omx->dynamic_buf_mode && !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY)) {
7113 omx->buf_ref_remove(omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd,
7114 omxhdr->nOffset);
7115 }
Arun Menon906de572013-06-18 17:01:40 -07007116 if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
7117 !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
Deva Ramasubramanianc1c7c122013-09-10 21:50:43 -07007118 !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) {
Praneeth Paladugu17364df2013-07-30 11:34:16 -07007119 omx->time_stamp_dts.remove_time_stamp(
7120 omxhdr->nTimeStamp,
7121 (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
7122 ?true:false);
Arun Menon906de572013-06-18 17:01:40 -07007123 omx->post_event ((unsigned)NULL,(unsigned int)omxhdr,
7124 OMX_COMPONENT_GENERATE_FTB);
7125 break;
7126 }
7127 if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
7128 omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
7129 }
7130 vdec_msg->msgdata.output_frame.bufferaddr =
7131 omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307132
7133 /* Post event if resolution OR crop changed */
7134 /* filled length will be changed if resolution changed */
7135 /* Crop parameters can be changed even without resolution change */
7136 if (omxhdr->nFilledLen
7137 && ((omx->prev_n_filled_len != omxhdr->nFilledLen)
7138 || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left)
7139 || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top)
7140 || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right)
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +05307141 || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom)
7142 || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width)
7143 || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) {
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307144
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +05307145 DEBUG_PRINT_HIGH("Paramters Changed From: Len: %u, WxH: %dx%d, L: %u, T: %u, R: %u, B: %u --> Len: %u, WxH: %dx%d, L: %u, T: %u, R: %u, B: %u",
7146 omx->prev_n_filled_len,
7147 omx->drv_ctx.video_resolution.frame_width,
7148 omx->drv_ctx.video_resolution.frame_height,
7149 omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top,
7150 omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom,
7151 omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width,
7152 vdec_msg->msgdata.output_frame.picsize.frame_height,
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307153 vdec_msg->msgdata.output_frame.framesize.left,
7154 vdec_msg->msgdata.output_frame.framesize.top,
7155 vdec_msg->msgdata.output_frame.framesize.right,
7156 vdec_msg->msgdata.output_frame.framesize.bottom);
7157
Maheshwar Ajja0f840ce2014-09-29 16:53:42 +05307158 omx->drv_ctx.video_resolution.frame_width =
7159 vdec_msg->msgdata.output_frame.picsize.frame_width;
7160 omx->drv_ctx.video_resolution.frame_height =
7161 vdec_msg->msgdata.output_frame.picsize.frame_height;
7162
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307163 memcpy(&omx->drv_ctx.frame_size,
7164 &vdec_msg->msgdata.output_frame.framesize,
7165 sizeof(struct vdec_framesize));
7166
7167 omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX,
7168 OMX_IndexConfigCommonOutputCrop,
7169 OMX_COMPONENT_GENERATE_PORT_RECONFIG);
Arun Menon906de572013-06-18 17:01:40 -07007170 }
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307171
Arun Menon906de572013-06-18 17:01:40 -07007172 if (omxhdr->nFilledLen)
7173 omx->prev_n_filled_len = omxhdr->nFilledLen;
7174
7175 output_respbuf = (struct vdec_output_frameinfo *)\
7176 omxhdr->pOutputPortPrivate;
7177 output_respbuf->len = vdec_msg->msgdata.output_frame.len;
7178 output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307179
Arun Menon906de572013-06-18 17:01:40 -07007180 if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
7181 output_respbuf->pic_type = PICTURE_TYPE_I;
7182 }
7183 if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
7184 output_respbuf->pic_type = PICTURE_TYPE_P;
7185 }
7186 if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
7187 output_respbuf->pic_type = PICTURE_TYPE_B;
7188 }
7189
7190 if (omx->output_use_buffer)
7191 memcpy ( omxhdr->pBuffer, (void *)
7192 ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
7193 (unsigned long)vdec_msg->msgdata.output_frame.offset),
7194 vdec_msg->msgdata.output_frame.len);
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307195 } else {
7196 DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u",
7197 (unsigned int)vdec_msg->msgdata.output_frame.len,
7198 omxhdr->nAllocLen, omx->prev_n_filled_len);
Arun Menon906de572013-06-18 17:01:40 -07007199 omxhdr->nFilledLen = 0;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307200 }
7201
Arun Menon906de572013-06-18 17:01:40 -07007202 omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
7203 OMX_COMPONENT_GENERATE_FBD);
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307204
7205 } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) {
Arun Menon906de572013-06-18 17:01:40 -07007206 omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
7207 OMX_COMPONENT_GENERATE_EOS_DONE);
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307208 } else {
Arun Menon906de572013-06-18 17:01:40 -07007209 omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
7210 OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
Maheshwar Ajjac366ad22014-07-09 17:31:13 +05307211 }
Arun Menon906de572013-06-18 17:01:40 -07007212 break;
7213 case VDEC_MSG_EVT_CONFIG_CHANGED:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007214 DEBUG_PRINT_HIGH("Port settings changed");
Arun Menon906de572013-06-18 17:01:40 -07007215 omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
7216 OMX_COMPONENT_GENERATE_PORT_RECONFIG);
7217 break;
7218 default:
7219 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007220 }
Arun Menon906de572013-06-18 17:01:40 -07007221 return rc;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007222}
7223
7224OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
Arun Menon906de572013-06-18 17:01:40 -07007225 OMX_HANDLETYPE hComp,
7226 OMX_BUFFERHEADERTYPE *buffer
7227 )
Shalaj Jain273b3e02012-06-22 19:08:03 -07007228{
Arun Menon906de572013-06-18 17:01:40 -07007229 unsigned address,p2,id;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007230 DEBUG_PRINT_LOW("Empty this arbitrary");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007231
Arun Menon906de572013-06-18 17:01:40 -07007232 if (buffer == NULL) {
7233 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007234 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007235 DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
7236 DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %lu, flags %lu, timestamp %lld",
Arun Menon906de572013-06-18 17:01:40 -07007237 buffer->nFilledLen, buffer->nFlags, buffer->nTimeStamp);
7238
7239 /* return zero length and not an EOS buffer */
7240 /* return buffer if input flush in progress */
7241 if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
7242 ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007243 DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
Arun Menon906de572013-06-18 17:01:40 -07007244 m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
7245 return OMX_ErrorNone;
7246 }
7247
7248 if (psource_frame == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007249 DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
Arun Menon906de572013-06-18 17:01:40 -07007250 psource_frame = buffer;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007251 DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
Arun Menon906de572013-06-18 17:01:40 -07007252 push_input_buffer (hComp);
7253 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007254 DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
Arun Menon906de572013-06-18 17:01:40 -07007255 if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
7256 (unsigned)NULL)) {
7257 return OMX_ErrorBadParameter;
7258 }
7259 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007260
Sowmya Pandiri302f5ab2014-04-03 13:41:03 -07007261 if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
7262 codec_config_flag = false;
7263 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007264
Arun Menon906de572013-06-18 17:01:40 -07007265 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007266}
7267
7268OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
7269{
Arun Menon906de572013-06-18 17:01:40 -07007270 unsigned address,p2,id;
7271 OMX_ERRORTYPE ret = OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007272
Arun Menon906de572013-06-18 17:01:40 -07007273 if (pdest_frame == NULL || psource_frame == NULL) {
7274 /*Check if we have a destination buffer*/
7275 if (pdest_frame == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007276 DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
Arun Menon906de572013-06-18 17:01:40 -07007277 if (m_input_free_q.m_size) {
7278 m_input_free_q.pop_entry(&address,&p2,&id);
7279 pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
7280 pdest_frame->nFilledLen = 0;
7281 pdest_frame->nTimeStamp = LLONG_MAX;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007282 DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
Arun Menon906de572013-06-18 17:01:40 -07007283 }
7284 }
7285
7286 /*Check if we have a destination buffer*/
7287 if (psource_frame == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007288 DEBUG_PRINT_LOW("Get a source buffer from the queue");
Arun Menon906de572013-06-18 17:01:40 -07007289 if (m_input_pending_q.m_size) {
7290 m_input_pending_q.pop_entry(&address,&p2,&id);
7291 psource_frame = (OMX_BUFFERHEADERTYPE *)address;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007292 DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
Arun Menon906de572013-06-18 17:01:40 -07007293 psource_frame->nTimeStamp);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007294 DEBUG_PRINT_LOW("Next source Buffer flag %lu length %lu",
Arun Menon906de572013-06-18 17:01:40 -07007295 psource_frame->nFlags,psource_frame->nFilledLen);
7296
7297 }
7298 }
7299
Shalaj Jain273b3e02012-06-22 19:08:03 -07007300 }
7301
Arun Menon906de572013-06-18 17:01:40 -07007302 while ((pdest_frame != NULL) && (psource_frame != NULL)) {
7303 switch (codec_type_parse) {
7304 case CODEC_TYPE_MPEG4:
7305 case CODEC_TYPE_H263:
7306 case CODEC_TYPE_MPEG2:
7307 ret = push_input_sc_codec(hComp);
7308 break;
7309 case CODEC_TYPE_H264:
7310 ret = push_input_h264(hComp);
7311 break;
7312 case CODEC_TYPE_VC1:
7313 ret = push_input_vc1(hComp);
7314 break;
7315 default:
7316 break;
7317 }
7318 if (ret != OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007319 DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
Arun Menon906de572013-06-18 17:01:40 -07007320 omx_report_error ();
7321 break;
7322 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007323 }
7324
Arun Menon906de572013-06-18 17:01:40 -07007325 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007326}
7327
7328OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
7329{
Arun Menon906de572013-06-18 17:01:40 -07007330 OMX_U32 partial_frame = 1;
7331 OMX_BOOL generate_ebd = OMX_TRUE;
7332 unsigned address = 0, p2 = 0, id = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007333
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007334 DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld",
Arun Menon906de572013-06-18 17:01:40 -07007335 psource_frame,psource_frame->nTimeStamp);
7336 if (m_frame_parser.parse_sc_frame(psource_frame,
7337 pdest_frame,&partial_frame) == -1) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007338 DEBUG_PRINT_ERROR("Error In Parsing Return Error");
Arun Menon906de572013-06-18 17:01:40 -07007339 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007340 }
Arun Menon906de572013-06-18 17:01:40 -07007341
7342 if (partial_frame == 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007343 DEBUG_PRINT_LOW("Frame size %lu source %p frame count %d",
Arun Menon906de572013-06-18 17:01:40 -07007344 pdest_frame->nFilledLen,psource_frame,frame_count);
7345
7346
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007347 DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp);
Arun Menon906de572013-06-18 17:01:40 -07007348 /*First Parsed buffer will have only header Hence skip*/
7349 if (frame_count == 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007350 DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
Arun Menon906de572013-06-18 17:01:40 -07007351
7352 if (codec_type_parse == CODEC_TYPE_MPEG4 ||
7353 codec_type_parse == CODEC_TYPE_DIVX) {
7354 mp4StreamType psBits;
7355 psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
7356 psBits.numBytes = pdest_frame->nFilledLen;
7357 mp4_headerparser.parseHeader(&psBits);
7358 }
7359
7360 frame_count++;
7361 } else {
7362 pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7363 if (pdest_frame->nFilledLen) {
7364 /*Push the frame to the Decoder*/
7365 if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
7366 return OMX_ErrorBadParameter;
7367 }
7368 frame_count++;
7369 pdest_frame = NULL;
7370
7371 if (m_input_free_q.m_size) {
7372 m_input_free_q.pop_entry(&address,&p2,&id);
7373 pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
7374 pdest_frame->nFilledLen = 0;
7375 }
7376 } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007377 DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
Arun Menon906de572013-06-18 17:01:40 -07007378 m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
7379 (unsigned)NULL);
7380 pdest_frame = NULL;
7381 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007382 }
Arun Menon906de572013-06-18 17:01:40 -07007383 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007384 DEBUG_PRINT_LOW("Not a Complete Frame %lu",pdest_frame->nFilledLen);
Arun Menon906de572013-06-18 17:01:40 -07007385 /*Check if Destination Buffer is full*/
7386 if (pdest_frame->nAllocLen ==
7387 pdest_frame->nFilledLen + pdest_frame->nOffset) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007388 DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
Arun Menon906de572013-06-18 17:01:40 -07007389 return OMX_ErrorStreamCorrupt;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007390 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007391 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007392
Arun Menon906de572013-06-18 17:01:40 -07007393 if (psource_frame->nFilledLen == 0) {
7394 if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
7395 if (pdest_frame) {
7396 pdest_frame->nFlags |= psource_frame->nFlags;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007397 DEBUG_PRINT_LOW("Frame Found start Decoding Size =%lu TimeStamp = %lld",
Arun Menon906de572013-06-18 17:01:40 -07007398 pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007399 DEBUG_PRINT_LOW("Found a frame size = %lu number = %d",
Arun Menon906de572013-06-18 17:01:40 -07007400 pdest_frame->nFilledLen,frame_count++);
7401 /*Push the frame to the Decoder*/
7402 if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
7403 return OMX_ErrorBadParameter;
7404 }
7405 frame_count++;
7406 pdest_frame = NULL;
7407 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007408 DEBUG_PRINT_LOW("Last frame in else dest addr") ;
Arun Menon906de572013-06-18 17:01:40 -07007409 generate_ebd = OMX_FALSE;
7410 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007411 }
Arun Menon906de572013-06-18 17:01:40 -07007412 if (generate_ebd) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007413 DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
Arun Menon906de572013-06-18 17:01:40 -07007414 m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7415 psource_frame = NULL;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007416
Arun Menon906de572013-06-18 17:01:40 -07007417 if (m_input_pending_q.m_size) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007418 DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
Arun Menon906de572013-06-18 17:01:40 -07007419 m_input_pending_q.pop_entry(&address,&p2,&id);
7420 psource_frame = (OMX_BUFFERHEADERTYPE *) address;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007421 DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
Arun Menon906de572013-06-18 17:01:40 -07007422 psource_frame->nTimeStamp);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007423 DEBUG_PRINT_LOW("Next source Buffer flag %lu length %lu",
Arun Menon906de572013-06-18 17:01:40 -07007424 psource_frame->nFlags,psource_frame->nFilledLen);
7425 }
7426 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007427 }
Arun Menon906de572013-06-18 17:01:40 -07007428 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007429}
7430
7431OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
7432{
Arun Menon906de572013-06-18 17:01:40 -07007433 OMX_U32 partial_frame = 1;
7434 unsigned address = 0, p2 = 0, id = 0;
7435 OMX_BOOL isNewFrame = OMX_FALSE;
7436 OMX_BOOL generate_ebd = OMX_TRUE;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007437
Arun Menon906de572013-06-18 17:01:40 -07007438 if (h264_scratch.pBuffer == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007439 DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
Arun Menon906de572013-06-18 17:01:40 -07007440 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007441 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007442 DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %lu "
Arun Menon906de572013-06-18 17:01:40 -07007443 "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007444 DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
Arun Menon906de572013-06-18 17:01:40 -07007445 if (h264_scratch.nFilledLen && look_ahead_nal) {
7446 look_ahead_nal = false;
7447 if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7448 h264_scratch.nFilledLen) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07007449 memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7450 h264_scratch.pBuffer,h264_scratch.nFilledLen);
7451 pdest_frame->nFilledLen += h264_scratch.nFilledLen;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007452 DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007453 h264_scratch.nFilledLen = 0;
Arun Menon906de572013-06-18 17:01:40 -07007454 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007455 DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007456 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007457 }
Arun Menon906de572013-06-18 17:01:40 -07007458 }
Praveen Chavance0b5e82013-08-08 05:23:34 -07007459
7460 /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result
7461 in EOS flag getting associated with the destination
7462 */
7463 if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) &&
7464 pdest_frame->nFilledLen) {
7465 DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'");
7466 generate_ebd = OMX_FALSE;
7467 }
7468
Arun Menon906de572013-06-18 17:01:40 -07007469 if (nal_length == 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007470 DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
Arun Menon906de572013-06-18 17:01:40 -07007471 if (m_frame_parser.parse_sc_frame(psource_frame,
7472 &h264_scratch,&partial_frame) == -1) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007473 DEBUG_PRINT_ERROR("Error In Parsing Return Error");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007474 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007475 }
Arun Menon906de572013-06-18 17:01:40 -07007476 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007477 DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
Arun Menon906de572013-06-18 17:01:40 -07007478 if (m_frame_parser.parse_h264_nallength(psource_frame,
7479 &h264_scratch,&partial_frame) == -1) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007480 DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
Arun Menon906de572013-06-18 17:01:40 -07007481 return OMX_ErrorBadParameter;
7482 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007483 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007484
Arun Menon906de572013-06-18 17:01:40 -07007485 if (partial_frame == 0) {
7486 if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007487 DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
Arun Menon906de572013-06-18 17:01:40 -07007488 nal_count++;
7489 h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
7490 h264_scratch.nFlags = psource_frame->nFlags;
7491 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007492 DEBUG_PRINT_LOW("Parsed New NAL Length = %lu",h264_scratch.nFilledLen);
Arun Menon906de572013-06-18 17:01:40 -07007493 if (h264_scratch.nFilledLen) {
7494 h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
7495 NALU_TYPE_SPS);
Shalaj Jain273b3e02012-06-22 19:08:03 -07007496#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
Arun Menon906de572013-06-18 17:01:40 -07007497 if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7498 h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7499 h264_scratch.nFilledLen, NALU_TYPE_SEI);
7500 else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7501 // If timeinfo is present frame info from SEI is already processed
7502 h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7503 h264_scratch.nFilledLen, NALU_TYPE_SEI);
Shalaj Jain273b3e02012-06-22 19:08:03 -07007504#endif
Arun Menon906de572013-06-18 17:01:40 -07007505 m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
7506 nal_count++;
7507 if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
7508 pdest_frame->nTimeStamp = h264_last_au_ts;
7509 pdest_frame->nFlags = h264_last_au_flags;
7510#ifdef PANSCAN_HDLR
7511 if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7512 h264_parser->update_panscan_data(h264_last_au_ts);
7513#endif
7514 }
7515 if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
7516 m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
7517 h264_last_au_ts = h264_scratch.nTimeStamp;
7518 h264_last_au_flags = h264_scratch.nFlags;
7519#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7520 if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
7521 OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
7522 if (!VALID_TS(h264_last_au_ts))
7523 h264_last_au_ts = ts_in_sei;
7524 }
7525#endif
7526 } else
7527 h264_last_au_ts = LLONG_MAX;
7528 }
7529
7530 if (!isNewFrame) {
7531 if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7532 h264_scratch.nFilledLen) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007533 DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %lu",
Arun Menon906de572013-06-18 17:01:40 -07007534 h264_scratch.nFilledLen);
7535 memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7536 h264_scratch.pBuffer,h264_scratch.nFilledLen);
7537 pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7538 if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
7539 pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
7540 h264_scratch.nFilledLen = 0;
7541 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007542 DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
Arun Menon906de572013-06-18 17:01:40 -07007543 return OMX_ErrorBadParameter;
7544 }
Leena Winterrowd5a974ce2013-08-06 15:10:36 -07007545 } else if(h264_scratch.nFilledLen) {
Arun Menon906de572013-06-18 17:01:40 -07007546 look_ahead_nal = true;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007547 DEBUG_PRINT_LOW("Frame Found start Decoding Size =%lu TimeStamp = %llu",
Arun Menon906de572013-06-18 17:01:40 -07007548 pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007549 DEBUG_PRINT_LOW("Found a frame size = %lu number = %d",
Arun Menon906de572013-06-18 17:01:40 -07007550 pdest_frame->nFilledLen,frame_count++);
7551
7552 if (pdest_frame->nFilledLen == 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007553 DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
Arun Menon906de572013-06-18 17:01:40 -07007554 look_ahead_nal = false;
7555 if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7556 h264_scratch.nFilledLen) {
7557 memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7558 h264_scratch.pBuffer,h264_scratch.nFilledLen);
7559 pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7560 h264_scratch.nFilledLen = 0;
7561 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007562 DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
Arun Menon906de572013-06-18 17:01:40 -07007563 return OMX_ErrorBadParameter;
7564 }
7565 } else {
7566 if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007567 DEBUG_PRINT_LOW("Reset the EOS Flag");
Arun Menon906de572013-06-18 17:01:40 -07007568 pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7569 }
7570 /*Push the frame to the Decoder*/
7571 if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
7572 return OMX_ErrorBadParameter;
7573 }
7574 //frame_count++;
7575 pdest_frame = NULL;
7576 if (m_input_free_q.m_size) {
7577 m_input_free_q.pop_entry(&address,&p2,&id);
7578 pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007579 DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
Arun Menon906de572013-06-18 17:01:40 -07007580 pdest_frame->nFilledLen = 0;
7581 pdest_frame->nFlags = 0;
7582 pdest_frame->nTimeStamp = LLONG_MAX;
7583 }
7584 }
7585 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007586 }
Arun Menon906de572013-06-18 17:01:40 -07007587 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007588 DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
Arun Menon906de572013-06-18 17:01:40 -07007589 /*Check if Destination Buffer is full*/
7590 if (h264_scratch.nAllocLen ==
7591 h264_scratch.nFilledLen + h264_scratch.nOffset) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007592 DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
Arun Menon906de572013-06-18 17:01:40 -07007593 return OMX_ErrorStreamCorrupt;
7594 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007595 }
Arun Menon906de572013-06-18 17:01:40 -07007596
7597 if (!psource_frame->nFilledLen) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007598 DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
Arun Menon906de572013-06-18 17:01:40 -07007599
7600 if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
7601 if (pdest_frame) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007602 DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
Arun Menon906de572013-06-18 17:01:40 -07007603 if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7604 h264_scratch.nFilledLen) {
Leena Winterrowd5a974ce2013-08-06 15:10:36 -07007605 if(pdest_frame->nFilledLen == 0) {
7606 /* No residual frame from before, send whatever
7607 * we have left */
7608 memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7609 h264_scratch.pBuffer, h264_scratch.nFilledLen);
7610 pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7611 h264_scratch.nFilledLen = 0;
7612 pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
7613 } else {
7614 m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
7615 if(!isNewFrame) {
7616 /* Have a residual frame, but we know that the
7617 * AU in this frame is belonging to whatever
7618 * frame we had left over. So append it */
7619 memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7620 h264_scratch.pBuffer,h264_scratch.nFilledLen);
7621 pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7622 h264_scratch.nFilledLen = 0;
Balamurugan Alagarsamyefde3832014-09-22 19:52:20 +05307623 if (h264_last_au_ts != LLONG_MAX)
7624 pdest_frame->nTimeStamp = h264_last_au_ts;
Leena Winterrowd5a974ce2013-08-06 15:10:36 -07007625 } else {
7626 /* Completely new frame, let's just push what
7627 * we have now. The resulting EBD would trigger
7628 * another push */
7629 generate_ebd = OMX_FALSE;
7630 pdest_frame->nTimeStamp = h264_last_au_ts;
7631 h264_last_au_ts = h264_scratch.nTimeStamp;
7632 }
7633 }
Arun Menon906de572013-06-18 17:01:40 -07007634 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007635 DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
Arun Menon906de572013-06-18 17:01:40 -07007636 return OMX_ErrorBadParameter;
7637 }
Leena Winterrowd5a974ce2013-08-06 15:10:36 -07007638
7639 /* Iff we coalesced two buffers, inherit the flags of both bufs */
7640 if(generate_ebd == OMX_TRUE) {
7641 pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
7642 }
Arun Menon906de572013-06-18 17:01:40 -07007643
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007644 DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%lu TimeStamp = %llu",
Arun Menon906de572013-06-18 17:01:40 -07007645 pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007646 DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
Arun Menon906de572013-06-18 17:01:40 -07007647#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7648 if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
7649 OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
7650 if (!VALID_TS(pdest_frame->nTimeStamp))
7651 pdest_frame->nTimeStamp = ts_in_sei;
7652 }
7653#endif
7654 /*Push the frame to the Decoder*/
7655 if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
7656 return OMX_ErrorBadParameter;
7657 }
7658 frame_count++;
7659 pdest_frame = NULL;
7660 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007661 DEBUG_PRINT_LOW("Last frame in else dest addr %p size %lu",
Arun Menon906de572013-06-18 17:01:40 -07007662 pdest_frame,h264_scratch.nFilledLen);
7663 generate_ebd = OMX_FALSE;
7664 }
7665 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007666 }
Arun Menon906de572013-06-18 17:01:40 -07007667 if (generate_ebd && !psource_frame->nFilledLen) {
7668 m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7669 psource_frame = NULL;
7670 if (m_input_pending_q.m_size) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007671 DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
Arun Menon906de572013-06-18 17:01:40 -07007672 m_input_pending_q.pop_entry(&address,&p2,&id);
7673 psource_frame = (OMX_BUFFERHEADERTYPE *) address;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007674 DEBUG_PRINT_LOW("Next source Buffer flag %lu src length %lu",
Arun Menon906de572013-06-18 17:01:40 -07007675 psource_frame->nFlags,psource_frame->nFilledLen);
7676 }
7677 }
7678 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007679}
7680
7681OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
7682{
7683 OMX_U8 *buf, *pdest;
7684 OMX_U32 partial_frame = 1;
7685 OMX_U32 buf_len, dest_len;
7686
Arun Menon906de572013-06-18 17:01:40 -07007687 if (first_frame == 0) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07007688 first_frame = 1;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007689 DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
Arun Menon906de572013-06-18 17:01:40 -07007690 if (!m_vendor_config.pData) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007691 DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007692 buf = psource_frame->pBuffer;
7693 buf_len = psource_frame->nFilledLen;
7694
7695 if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
Arun Menon906de572013-06-18 17:01:40 -07007696 VC1_SP_MP_START_CODE) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07007697 m_vc1_profile = VC1_SP_MP_RCV;
Arun Menon906de572013-06-18 17:01:40 -07007698 } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07007699 m_vc1_profile = VC1_AP;
Arun Menon906de572013-06-18 17:01:40 -07007700 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007701 DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007702 return OMX_ErrorStreamCorrupt;
7703 }
Arun Menon906de572013-06-18 17:01:40 -07007704 } else {
Shalaj Jain273b3e02012-06-22 19:08:03 -07007705 pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
7706 pdest_frame->nOffset;
7707 dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
Arun Menon906de572013-06-18 17:01:40 -07007708 pdest_frame->nOffset);
Shalaj Jain273b3e02012-06-22 19:08:03 -07007709
Arun Menon906de572013-06-18 17:01:40 -07007710 if (dest_len < m_vendor_config.nDataSize) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007711 DEBUG_PRINT_ERROR("Destination buffer full");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007712 return OMX_ErrorBadParameter;
Arun Menon906de572013-06-18 17:01:40 -07007713 } else {
Shalaj Jain273b3e02012-06-22 19:08:03 -07007714 memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
7715 pdest_frame->nFilledLen += m_vendor_config.nDataSize;
7716 }
7717 }
7718 }
7719
Arun Menon906de572013-06-18 17:01:40 -07007720 switch (m_vc1_profile) {
Shalaj Jain273b3e02012-06-22 19:08:03 -07007721 case VC1_AP:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007722 DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
Arun Menon906de572013-06-18 17:01:40 -07007723 if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007724 DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007725 return OMX_ErrorBadParameter;
7726 }
Arun Menon906de572013-06-18 17:01:40 -07007727 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007728
7729 case VC1_SP_MP_RCV:
7730 default:
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007731 DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
Shalaj Jain273b3e02012-06-22 19:08:03 -07007732 return OMX_ErrorBadParameter;
7733 }
7734 return OMX_ErrorNone;
7735}
7736
David Ng38e2d232013-03-15 20:05:58 -07007737#ifndef USE_ION
Shalaj Jain273b3e02012-06-22 19:08:03 -07007738bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
Arun Menon906de572013-06-18 17:01:40 -07007739 OMX_U32 alignment)
Shalaj Jain273b3e02012-06-22 19:08:03 -07007740{
Arun Menon906de572013-06-18 17:01:40 -07007741 struct pmem_allocation allocation;
7742 allocation.size = buffer_size;
7743 allocation.align = clip2(alignment);
7744 if (allocation.align < 4096) {
7745 allocation.align = 4096;
7746 }
7747 if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007748 DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
Arun Menon906de572013-06-18 17:01:40 -07007749 allocation.align, allocation.size);
7750 return false;
7751 }
7752 return true;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007753}
David Ng38e2d232013-03-15 20:05:58 -07007754#endif
Shalaj Jain273b3e02012-06-22 19:08:03 -07007755#ifdef USE_ION
7756int omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
Arun Menon906de572013-06-18 17:01:40 -07007757 OMX_U32 alignment, struct ion_allocation_data *alloc_data,
7758 struct ion_fd_data *fd_data, int flag)
Shalaj Jain273b3e02012-06-22 19:08:03 -07007759{
Arun Menon906de572013-06-18 17:01:40 -07007760 int fd = -EINVAL;
7761 int rc = -EINVAL;
7762 int ion_dev_flag;
7763 struct vdec_ion ion_buf_info;
7764 if (!alloc_data || buffer_size <= 0 || !fd_data) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007765 DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
Arun Menon906de572013-06-18 17:01:40 -07007766 return -EINVAL;
7767 }
7768 ion_dev_flag = O_RDONLY;
7769 fd = open (MEM_DEVICE, ion_dev_flag);
7770 if (fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007771 DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
Arun Menon906de572013-06-18 17:01:40 -07007772 return fd;
7773 }
7774 alloc_data->flags = 0;
7775 if (!secure_mode && (flag & ION_FLAG_CACHED)) {
7776 alloc_data->flags |= ION_FLAG_CACHED;
7777 }
7778 alloc_data->len = buffer_size;
7779 alloc_data->align = clip2(alignment);
7780 if (alloc_data->align < 4096) {
7781 alloc_data->align = 4096;
7782 }
7783 if ((secure_mode) && (flag & ION_SECURE))
7784 alloc_data->flags |= ION_SECURE;
Vinay Kalia53fa6832012-10-11 17:55:30 -07007785
Arun Menon906de572013-06-18 17:01:40 -07007786 alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05307787 if (secure_mode && (alloc_data->flags & ION_SECURE))
Arun Menon906de572013-06-18 17:01:40 -07007788 alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
7789 rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
7790 if (rc || !alloc_data->handle) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007791 DEBUG_PRINT_ERROR("ION ALLOC memory failed ");
Arun Menon906de572013-06-18 17:01:40 -07007792 alloc_data->handle = NULL;
7793 close(fd);
7794 fd = -ENOMEM;
7795 return fd;
7796 }
7797 fd_data->handle = alloc_data->handle;
7798 rc = ioctl(fd,ION_IOC_MAP,fd_data);
7799 if (rc) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007800 DEBUG_PRINT_ERROR("ION MAP failed ");
Arun Menon906de572013-06-18 17:01:40 -07007801 ion_buf_info.ion_alloc_data = *alloc_data;
7802 ion_buf_info.ion_device_fd = fd;
7803 ion_buf_info.fd_ion_data = *fd_data;
7804 free_ion_memory(&ion_buf_info);
7805 fd_data->fd =-1;
Arun Menon906de572013-06-18 17:01:40 -07007806 fd = -ENOMEM;
7807 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007808
Arun Menon906de572013-06-18 17:01:40 -07007809 return fd;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007810}
7811
Arun Menon906de572013-06-18 17:01:40 -07007812void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
7813{
Shalaj Jain273b3e02012-06-22 19:08:03 -07007814
Arun Menon906de572013-06-18 17:01:40 -07007815 if (!buf_ion_info) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007816 DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
Arun Menon906de572013-06-18 17:01:40 -07007817 return;
7818 }
7819 if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
7820 &buf_ion_info->ion_alloc_data.handle)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007821 DEBUG_PRINT_ERROR("ION: free failed" );
Arun Menon906de572013-06-18 17:01:40 -07007822 }
7823 close(buf_ion_info->ion_device_fd);
7824 buf_ion_info->ion_device_fd = -1;
7825 buf_ion_info->ion_alloc_data.handle = NULL;
7826 buf_ion_info->fd_ion_data.fd = -1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007827}
7828#endif
7829void omx_vdec::free_output_buffer_header()
7830{
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007831 DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
Arun Menon906de572013-06-18 17:01:40 -07007832 output_use_buffer = false;
7833 ouput_egl_buffers = false;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007834
Arun Menon906de572013-06-18 17:01:40 -07007835 if (m_out_mem_ptr) {
7836 free (m_out_mem_ptr);
7837 m_out_mem_ptr = NULL;
7838 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007839
Arun Menon906de572013-06-18 17:01:40 -07007840 if (m_platform_list) {
7841 free(m_platform_list);
7842 m_platform_list = NULL;
7843 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007844
Arun Menon906de572013-06-18 17:01:40 -07007845 if (drv_ctx.ptr_respbuffer) {
7846 free (drv_ctx.ptr_respbuffer);
7847 drv_ctx.ptr_respbuffer = NULL;
7848 }
7849 if (drv_ctx.ptr_outputbuffer) {
7850 free (drv_ctx.ptr_outputbuffer);
7851 drv_ctx.ptr_outputbuffer = NULL;
7852 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007853#ifdef USE_ION
7854 if (drv_ctx.op_buf_ion_info) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007855 DEBUG_PRINT_LOW("Free o/p ion context");
Arun Menon906de572013-06-18 17:01:40 -07007856 free(drv_ctx.op_buf_ion_info);
Shalaj Jain273b3e02012-06-22 19:08:03 -07007857 drv_ctx.op_buf_ion_info = NULL;
7858 }
7859#endif
Arun Menonbdb80b02013-08-12 17:45:54 -07007860 if (out_dynamic_list) {
7861 free(out_dynamic_list);
7862 out_dynamic_list = NULL;
7863 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007864}
7865
7866void omx_vdec::free_input_buffer_header()
7867{
7868 input_use_buffer = false;
Arun Menon906de572013-06-18 17:01:40 -07007869 if (arbitrary_bytes) {
Arun Menon906de572013-06-18 17:01:40 -07007870 if (m_inp_heap_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007871 DEBUG_PRINT_LOW("Free input Heap Pointer");
Arun Menon906de572013-06-18 17:01:40 -07007872 free (m_inp_heap_ptr);
7873 m_inp_heap_ptr = NULL;
7874 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007875
Arun Menon906de572013-06-18 17:01:40 -07007876 if (m_phdr_pmem_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007877 DEBUG_PRINT_LOW("Free input pmem header Pointer");
Arun Menon906de572013-06-18 17:01:40 -07007878 free (m_phdr_pmem_ptr);
7879 m_phdr_pmem_ptr = NULL;
7880 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07007881 }
Arun Menon906de572013-06-18 17:01:40 -07007882 if (m_inp_mem_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007883 DEBUG_PRINT_LOW("Free input pmem Pointer area");
Arun Menon906de572013-06-18 17:01:40 -07007884 free (m_inp_mem_ptr);
7885 m_inp_mem_ptr = NULL;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007886 }
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07007887 /* We just freed all the buffer headers, every thing in m_input_free_q,
7888 * m_input_pending_q, pdest_frame, and psource_frame is now invalid */
Leena Winterrowd1d2424a2013-08-20 15:26:02 -07007889 while (m_input_free_q.m_size) {
7890 unsigned address, p2, id;
7891 m_input_free_q.pop_entry(&address, &p2, &id);
7892 }
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07007893 while (m_input_pending_q.m_size) {
7894 unsigned address, p2, id;
7895 m_input_pending_q.pop_entry(&address, &p2, &id);
7896 }
7897 pdest_frame = NULL;
7898 psource_frame = NULL;
Arun Menon906de572013-06-18 17:01:40 -07007899 if (drv_ctx.ptr_inputbuffer) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007900 DEBUG_PRINT_LOW("Free Driver Context pointer");
Arun Menon906de572013-06-18 17:01:40 -07007901 free (drv_ctx.ptr_inputbuffer);
7902 drv_ctx.ptr_inputbuffer = NULL;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007903 }
7904#ifdef USE_ION
7905 if (drv_ctx.ip_buf_ion_info) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007906 DEBUG_PRINT_LOW("Free ion context");
Arun Menon906de572013-06-18 17:01:40 -07007907 free(drv_ctx.ip_buf_ion_info);
Shalaj Jain273b3e02012-06-22 19:08:03 -07007908 drv_ctx.ip_buf_ion_info = NULL;
7909 }
7910#endif
7911}
Deva Ramasubramanianf97488b2012-10-26 18:37:05 -07007912
7913int omx_vdec::stream_off(OMX_U32 port)
Shalaj Jain273b3e02012-06-22 19:08:03 -07007914{
Arun Menon906de572013-06-18 17:01:40 -07007915 enum v4l2_buf_type btype;
7916 int rc = 0;
7917 enum v4l2_ports v4l2_port = OUTPUT_PORT;
Deva Ramasubramanianf97488b2012-10-26 18:37:05 -07007918
Arun Menon906de572013-06-18 17:01:40 -07007919 if (port == OMX_CORE_INPUT_PORT_INDEX) {
7920 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7921 v4l2_port = OUTPUT_PORT;
7922 } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
7923 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7924 v4l2_port = CAPTURE_PORT;
7925 } else if (port == OMX_ALL) {
7926 int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
7927 int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
Deva Ramasubramanianf97488b2012-10-26 18:37:05 -07007928
Arun Menon906de572013-06-18 17:01:40 -07007929 if (!rc_input)
7930 return rc_input;
7931 else
7932 return rc_output;
7933 }
Deva Ramasubramanianf97488b2012-10-26 18:37:05 -07007934
Arun Menon906de572013-06-18 17:01:40 -07007935 if (!streaming[v4l2_port]) {
7936 // already streamed off, warn and move on
7937 DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
7938 " which is already streamed off", v4l2_port);
7939 return 0;
7940 }
Deva Ramasubramanianf97488b2012-10-26 18:37:05 -07007941
Arun Menon906de572013-06-18 17:01:40 -07007942 DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
Deva Ramasubramanianf97488b2012-10-26 18:37:05 -07007943
Arun Menon906de572013-06-18 17:01:40 -07007944 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
7945 if (rc) {
7946 /*TODO: How to handle this case */
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007947 DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
Arun Menon906de572013-06-18 17:01:40 -07007948 } else {
7949 streaming[v4l2_port] = false;
7950 }
Deva Ramasubramanianf97488b2012-10-26 18:37:05 -07007951
Arun Menon906de572013-06-18 17:01:40 -07007952 return rc;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007953}
7954
7955OMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
7956{
Arun Menon906de572013-06-18 17:01:40 -07007957 OMX_ERRORTYPE eRet = OMX_ErrorNone;
7958 struct v4l2_requestbuffers bufreq;
Deva Ramasubramanian991d0db2014-05-08 15:02:24 -07007959 unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0;
Pushkaraj Patil1ab10292014-02-11 20:10:42 +05307960 unsigned int final_extra_data_size = 0;
Arun Menon906de572013-06-18 17:01:40 -07007961 struct v4l2_format fmt;
7962 int ret = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07007963 DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
Arun Menon906de572013-06-18 17:01:40 -07007964 buffer_prop->actualcount, buffer_prop->buffer_size);
7965 bufreq.memory = V4L2_MEMORY_USERPTR;
7966 bufreq.count = 1;
7967 if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
7968 bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7969 fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7970 fmt.fmt.pix_mp.pixelformat = output_capability;
7971 } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
7972 bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7973 fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7974 fmt.fmt.pix_mp.pixelformat = capture_capability;
7975 } else {
7976 eRet = OMX_ErrorBadParameter;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07007977 }
Arun Menon906de572013-06-18 17:01:40 -07007978 if (eRet==OMX_ErrorNone) {
7979 ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
Shalaj Jain273b3e02012-06-22 19:08:03 -07007980 }
Arun Menon906de572013-06-18 17:01:40 -07007981 if (ret) {
7982 DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7983 /*TODO: How to handle this case */
7984 eRet = OMX_ErrorInsufficientResources;
7985 return eRet;
7986 } else {
7987 buffer_prop->actualcount = bufreq.count;
7988 buffer_prop->mincount = bufreq.count;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07007989 DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
Shalaj Jain273b3e02012-06-22 19:08:03 -07007990 }
Arun Menon906de572013-06-18 17:01:40 -07007991 DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7992 buffer_prop->actualcount, buffer_prop->buffer_size);
7993
7994 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
7995 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
7996
7997 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
7998
7999 update_resolution(fmt.fmt.pix_mp.width,
8000 fmt.fmt.pix_mp.height,
8001 fmt.fmt.pix_mp.plane_fmt[0].bytesperline,
8002 fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
8003 if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
8004 drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008005 DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
Arun Menon906de572013-06-18 17:01:40 -07008006
8007 if (ret) {
8008 /*TODO: How to handle this case */
8009 DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
8010 eRet = OMX_ErrorInsufficientResources;
8011 } else {
8012 int extra_idx = 0;
8013
8014 eRet = is_video_session_supported();
8015 if (eRet)
8016 return eRet;
8017
8018 buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
8019 buf_size = buffer_prop->buffer_size;
8020 extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
8021 if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
8022 extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
8023 } else if (extra_idx >= VIDEO_MAX_PLANES) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008024 DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
Arun Menon906de572013-06-18 17:01:40 -07008025 return OMX_ErrorBadParameter;
8026 }
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08008027
Deva Ramasubramanian991d0db2014-05-08 15:02:24 -07008028 default_extra_data_size = VENUS_EXTRADATA_SIZE(
8029 drv_ctx.video_resolution.frame_height,
8030 drv_ctx.video_resolution.frame_width);
8031 final_extra_data_size = extra_data_size > default_extra_data_size ?
8032 extra_data_size : default_extra_data_size;
8033
8034 final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) &
8035 (~(buffer_prop->alignment - 1));
Deva Ramasubramanian2ebfed32014-04-24 13:34:24 -07008036
Pushkaraj Patil1ab10292014-02-11 20:10:42 +05308037 drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size;
Arun Menon906de572013-06-18 17:01:40 -07008038 drv_ctx.extradata_info.count = buffer_prop->actualcount;
Pushkaraj Patil1ab10292014-02-11 20:10:42 +05308039 drv_ctx.extradata_info.buffer_size = final_extra_data_size;
Pushkaraj Patil74b2eaf2014-06-13 17:07:50 +05308040 if (!secure_mode)
8041 buf_size += final_extra_data_size;
Arun Menon906de572013-06-18 17:01:40 -07008042 buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
8043 DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
8044 buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008045 if (extra_data_size)
8046 DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%d)",
8047 drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size);
8048
Arun Menon906de572013-06-18 17:01:40 -07008049 if (in_reconfig) // BufReq will be set to driver when port is disabled
8050 buffer_prop->buffer_size = buf_size;
8051 else if (buf_size != buffer_prop->buffer_size) {
8052 buffer_prop->buffer_size = buf_size;
8053 eRet = set_buffer_req(buffer_prop);
8054 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008055 }
Arun Menon906de572013-06-18 17:01:40 -07008056 DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
8057 buffer_prop->actualcount, buffer_prop->buffer_size);
8058 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008059}
8060
8061OMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
8062{
Arun Menon906de572013-06-18 17:01:40 -07008063 OMX_ERRORTYPE eRet = OMX_ErrorNone;
8064 unsigned buf_size = 0;
8065 struct v4l2_format fmt;
8066 struct v4l2_requestbuffers bufreq;
8067 int ret;
8068 DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
8069 buffer_prop->actualcount, buffer_prop->buffer_size);
8070 buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
8071 if (buf_size != buffer_prop->buffer_size) {
8072 DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
8073 buffer_prop->buffer_size, buf_size);
8074 eRet = OMX_ErrorBadParameter;
8075 } else {
8076 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
8077 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
Deva Ramasubramanian614f79e2012-08-10 21:42:10 -07008078
Arun Menon906de572013-06-18 17:01:40 -07008079 if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
8080 fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
8081 fmt.fmt.pix_mp.pixelformat = output_capability;
Shalaj Jaind3902bb2013-10-07 12:42:55 -07008082 fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
Arun Menon906de572013-06-18 17:01:40 -07008083 } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
8084 fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
8085 fmt.fmt.pix_mp.pixelformat = capture_capability;
8086 } else {
8087 eRet = OMX_ErrorBadParameter;
8088 }
Deva Ramasubramanian614f79e2012-08-10 21:42:10 -07008089
Arun Menon906de572013-06-18 17:01:40 -07008090 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
8091 if (ret) {
8092 /*TODO: How to handle this case */
8093 DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
8094 eRet = OMX_ErrorInsufficientResources;
8095 }
8096
8097 bufreq.memory = V4L2_MEMORY_USERPTR;
8098 bufreq.count = buffer_prop->actualcount;
8099 if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
8100 bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
8101 } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
8102 bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
8103 } else {
8104 eRet = OMX_ErrorBadParameter;
8105 }
8106
8107 if (eRet==OMX_ErrorNone) {
8108 ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
8109 }
8110
8111 if (ret) {
8112 DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
8113 /*TODO: How to handle this case */
8114 eRet = OMX_ErrorInsufficientResources;
8115 } else if (bufreq.count < buffer_prop->actualcount) {
8116 DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
8117 " on v4l2 port %d to %d (prefers %d)", bufreq.type,
8118 buffer_prop->actualcount, bufreq.count);
8119 eRet = OMX_ErrorInsufficientResources;
8120 } else {
8121 if (!client_buffers.update_buffer_req()) {
8122 DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
8123 eRet = OMX_ErrorInsufficientResources;
8124 }
8125 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008126 }
Arun Menon906de572013-06-18 17:01:40 -07008127 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008128}
8129
Shalaj Jain273b3e02012-06-22 19:08:03 -07008130OMX_ERRORTYPE omx_vdec::update_picture_resolution()
8131{
Arun Menon906de572013-06-18 17:01:40 -07008132 OMX_ERRORTYPE eRet = OMX_ErrorNone;
8133 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008134}
8135
8136OMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
8137{
Arun Menon906de572013-06-18 17:01:40 -07008138 OMX_ERRORTYPE eRet = OMX_ErrorNone;
Pushkaraj Patil41588352014-02-25 20:51:34 +05308139 struct v4l2_format fmt;
Arun Menon906de572013-06-18 17:01:40 -07008140 if (!portDefn) {
8141 return OMX_ErrorBadParameter;
Vinay Kaliada4f4422013-01-09 10:45:03 -08008142 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008143 DEBUG_PRINT_LOW("omx_vdec::update_portdef");
Arun Menon906de572013-06-18 17:01:40 -07008144 portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
8145 portDefn->nSize = sizeof(portDefn);
8146 portDefn->eDomain = OMX_PortDomainVideo;
8147 if (drv_ctx.frame_rate.fps_denominator > 0)
Deva Ramasubramanian9ba5d832014-01-03 18:32:50 -08008148 portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator /
8149 drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format
Arun Menon906de572013-06-18 17:01:40 -07008150 else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008151 DEBUG_PRINT_ERROR("Error: Divide by zero");
Arun Menon906de572013-06-18 17:01:40 -07008152 return OMX_ErrorBadParameter;
Vinay Kaliada4f4422013-01-09 10:45:03 -08008153 }
Pushkaraj Patil41588352014-02-25 20:51:34 +05308154 memset(&fmt, 0x0, sizeof(struct v4l2_format));
Arun Menon906de572013-06-18 17:01:40 -07008155 if (0 == portDefn->nPortIndex) {
8156 portDefn->eDir = OMX_DirInput;
8157 portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
8158 portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount;
8159 portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size;
8160 portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
8161 portDefn->format.video.eCompressionFormat = eCompressionFormat;
8162 portDefn->bEnabled = m_inp_bEnabled;
8163 portDefn->bPopulated = m_inp_bPopulated;
Pushkaraj Patil41588352014-02-25 20:51:34 +05308164
8165 fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
8166 fmt.fmt.pix_mp.pixelformat = output_capability;
Arun Menon906de572013-06-18 17:01:40 -07008167 } else if (1 == portDefn->nPortIndex) {
8168 unsigned int buf_size = 0;
8169 if (!client_buffers.update_buffer_req()) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008170 DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
Arun Menon906de572013-06-18 17:01:40 -07008171 return OMX_ErrorHardware;
8172 }
8173 if (!client_buffers.get_buffer_req(buf_size)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008174 DEBUG_PRINT_ERROR("update buffer requirements");
Arun Menon906de572013-06-18 17:01:40 -07008175 return OMX_ErrorHardware;
8176 }
8177 portDefn->nBufferSize = buf_size;
8178 portDefn->eDir = OMX_DirOutput;
8179 portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
8180 portDefn->nBufferCountMin = drv_ctx.op_buf.mincount;
8181 portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
8182 portDefn->bEnabled = m_out_bEnabled;
8183 portDefn->bPopulated = m_out_bPopulated;
8184 if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008185 DEBUG_PRINT_ERROR("Error in getting color format");
Arun Menon906de572013-06-18 17:01:40 -07008186 return OMX_ErrorHardware;
8187 }
Pushkaraj Patil41588352014-02-25 20:51:34 +05308188 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
8189 fmt.fmt.pix_mp.pixelformat = capture_capability;
Arun Menon906de572013-06-18 17:01:40 -07008190 } else {
8191 portDefn->eDir = OMX_DirMax;
8192 DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
8193 (int)portDefn->nPortIndex);
8194 eRet = OMX_ErrorBadPortIndex;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008195 }
Pushkaraj Patil41588352014-02-25 20:51:34 +05308196 if (is_down_scalar_enabled) {
8197 int ret = 0;
8198 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
8199 if (ret) {
8200 DEBUG_PRINT_ERROR("update_portdef : Error in getting port resolution");
8201 return OMX_ErrorHardware;
8202 } else {
8203 portDefn->format.video.nFrameWidth = fmt.fmt.pix_mp.width;
8204 portDefn->format.video.nFrameHeight = fmt.fmt.pix_mp.height;
8205 portDefn->format.video.nStride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
8206 portDefn->format.video.nSliceHeight = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
8207 }
8208 } else {
8209 portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height;
8210 portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width;
8211 portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
8212 portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
8213 }
8214
Praveen Chavandb7776f2014-02-06 18:17:25 -08008215 if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) ||
8216 (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
Maheshwar Ajja507d6552014-01-03 14:54:29 +05308217 portDefn->format.video.nStride = drv_ctx.video_resolution.frame_width;
8218 portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height;
8219 }
8220 DEBUG_PRINT_HIGH("update_portdef(%lu): Width = %lu Height = %lu Stride = %ld "
8221 "SliceHeight = %lu eColorFormat = %lu nBufSize %lu nBufCnt %lu",
8222 portDefn->nPortIndex,
8223 portDefn->format.video.nFrameWidth,
Arun Menon906de572013-06-18 17:01:40 -07008224 portDefn->format.video.nFrameHeight,
8225 portDefn->format.video.nStride,
Maheshwar Ajja507d6552014-01-03 14:54:29 +05308226 portDefn->format.video.nSliceHeight,
8227 portDefn->format.video.eColorFormat,
8228 portDefn->nBufferSize,
8229 portDefn->nBufferCountActual);
Shalaj Jain273b3e02012-06-22 19:08:03 -07008230
Maheshwar Ajja507d6552014-01-03 14:54:29 +05308231 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008232}
8233
8234OMX_ERRORTYPE omx_vdec::allocate_output_headers()
8235{
Arun Menon906de572013-06-18 17:01:40 -07008236 OMX_ERRORTYPE eRet = OMX_ErrorNone;
8237 OMX_BUFFERHEADERTYPE *bufHdr = NULL;
8238 unsigned i= 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008239
Arun Menon906de572013-06-18 17:01:40 -07008240 if (!m_out_mem_ptr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008241 DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
Arun Menon906de572013-06-18 17:01:40 -07008242 int nBufHdrSize = 0;
8243 int nPlatformEntrySize = 0;
8244 int nPlatformListSize = 0;
8245 int nPMEMInfoSize = 0;
8246 OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList;
8247 OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry;
8248 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008249
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008250 DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
Arun Menon906de572013-06-18 17:01:40 -07008251 drv_ctx.op_buf.actualcount);
8252 nBufHdrSize = drv_ctx.op_buf.actualcount *
8253 sizeof(OMX_BUFFERHEADERTYPE);
Shalaj Jain273b3e02012-06-22 19:08:03 -07008254
Arun Menon906de572013-06-18 17:01:40 -07008255 nPMEMInfoSize = drv_ctx.op_buf.actualcount *
8256 sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
8257 nPlatformListSize = drv_ctx.op_buf.actualcount *
8258 sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
8259 nPlatformEntrySize = drv_ctx.op_buf.actualcount *
8260 sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
Shalaj Jain273b3e02012-06-22 19:08:03 -07008261
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008262 DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
Arun Menon906de572013-06-18 17:01:40 -07008263 sizeof(OMX_BUFFERHEADERTYPE),
8264 nPMEMInfoSize,
8265 nPlatformListSize);
Deva Ramasubramanianeb819322014-07-17 14:23:35 -07008266 DEBUG_PRINT_LOW("PE %d bmSize %"PRId64, nPlatformEntrySize,
Arun Menon906de572013-06-18 17:01:40 -07008267 m_out_bm_count);
8268 m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1);
8269 // Alloc mem for platform specific info
8270 char *pPtr=NULL;
8271 pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
8272 nPMEMInfoSize,1);
8273 drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
8274 calloc (sizeof(struct vdec_bufferpayload),
8275 drv_ctx.op_buf.actualcount);
8276 drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\
8277 calloc (sizeof (struct vdec_output_frameinfo),
8278 drv_ctx.op_buf.actualcount);
Arun Menon8544ead2014-05-08 17:42:29 -07008279 if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
8280 DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer");
8281 return OMX_ErrorInsufficientResources;
8282 }
8283
Shalaj Jain273b3e02012-06-22 19:08:03 -07008284#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07008285 drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
8286 calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
Arun Menon8544ead2014-05-08 17:42:29 -07008287 if (!drv_ctx.op_buf_ion_info) {
8288 DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
8289 return OMX_ErrorInsufficientResources;
8290 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008291#endif
Arun Menonbdb80b02013-08-12 17:45:54 -07008292 if (dynamic_buf_mode) {
8293 out_dynamic_list = (struct dynamic_buf_list *) \
8294 calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount);
8295 }
Arun Menon906de572013-06-18 17:01:40 -07008296 if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
8297 && drv_ctx.ptr_respbuffer) {
8298 bufHdr = m_out_mem_ptr;
8299 m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
8300 m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
8301 (((char *) m_platform_list) + nPlatformListSize);
8302 m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
8303 (((char *) m_platform_entry) + nPlatformEntrySize);
8304 pPlatformList = m_platform_list;
8305 pPlatformEntry = m_platform_entry;
8306 pPMEMInfo = m_pmem_info;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008307
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008308 DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
Shalaj Jain273b3e02012-06-22 19:08:03 -07008309
Arun Menon906de572013-06-18 17:01:40 -07008310 // Settting the entire storage nicely
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008311 DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
Arun Menon906de572013-06-18 17:01:40 -07008312 m_out_mem_ptr,pPlatformEntry);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008313 DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
Arun Menon906de572013-06-18 17:01:40 -07008314 for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
8315 bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
8316 bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
8317 // Set the values when we determine the right HxW param
8318 bufHdr->nAllocLen = 0;
8319 bufHdr->nFilledLen = 0;
8320 bufHdr->pAppPrivate = NULL;
8321 bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8322 pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
8323 pPlatformEntry->entry = pPMEMInfo;
8324 // Initialize the Platform List
8325 pPlatformList->nEntries = 1;
8326 pPlatformList->entryList = pPlatformEntry;
8327 // Keep pBuffer NULL till vdec is opened
8328 bufHdr->pBuffer = NULL;
8329 pPMEMInfo->offset = 0;
8330 pPMEMInfo->pmem_fd = 0;
8331 bufHdr->pPlatformPrivate = pPlatformList;
8332 drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008333#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07008334 drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008335#endif
Arun Menon906de572013-06-18 17:01:40 -07008336 /*Create a mapping between buffers*/
8337 bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
8338 drv_ctx.ptr_respbuffer[i].client_data = (void *) \
8339 &drv_ctx.ptr_outputbuffer[i];
8340 // Move the buffer and buffer header pointers
8341 bufHdr++;
8342 pPMEMInfo++;
8343 pPlatformEntry++;
8344 pPlatformList++;
8345 }
8346 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008347 DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
Arun Menon906de572013-06-18 17:01:40 -07008348 m_out_mem_ptr, pPtr);
8349 if (m_out_mem_ptr) {
8350 free(m_out_mem_ptr);
8351 m_out_mem_ptr = NULL;
8352 }
8353 if (pPtr) {
8354 free(pPtr);
8355 pPtr = NULL;
8356 }
8357 if (drv_ctx.ptr_outputbuffer) {
8358 free(drv_ctx.ptr_outputbuffer);
8359 drv_ctx.ptr_outputbuffer = NULL;
8360 }
8361 if (drv_ctx.ptr_respbuffer) {
8362 free(drv_ctx.ptr_respbuffer);
8363 drv_ctx.ptr_respbuffer = NULL;
8364 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008365#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07008366 if (drv_ctx.op_buf_ion_info) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008367 DEBUG_PRINT_LOW("Free o/p ion context");
Arun Menon906de572013-06-18 17:01:40 -07008368 free(drv_ctx.op_buf_ion_info);
8369 drv_ctx.op_buf_ion_info = NULL;
8370 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008371#endif
Arun Menon906de572013-06-18 17:01:40 -07008372 eRet = OMX_ErrorInsufficientResources;
8373 }
8374 } else {
8375 eRet = OMX_ErrorInsufficientResources;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008376 }
Arun Menon906de572013-06-18 17:01:40 -07008377 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008378}
8379
8380void omx_vdec::complete_pending_buffer_done_cbs()
8381{
Arun Menon906de572013-06-18 17:01:40 -07008382 unsigned p1;
8383 unsigned p2;
8384 unsigned ident;
8385 omx_cmd_queue tmp_q, pending_bd_q;
8386 pthread_mutex_lock(&m_lock);
8387 // pop all pending GENERATE FDB from ftb queue
8388 while (m_ftb_q.m_size) {
8389 m_ftb_q.pop_entry(&p1,&p2,&ident);
8390 if (ident == OMX_COMPONENT_GENERATE_FBD) {
8391 pending_bd_q.insert_entry(p1,p2,ident);
8392 } else {
8393 tmp_q.insert_entry(p1,p2,ident);
Shalaj Jain273b3e02012-06-22 19:08:03 -07008394 }
Arun Menon906de572013-06-18 17:01:40 -07008395 }
8396 //return all non GENERATE FDB to ftb queue
8397 while (tmp_q.m_size) {
8398 tmp_q.pop_entry(&p1,&p2,&ident);
8399 m_ftb_q.insert_entry(p1,p2,ident);
8400 }
8401 // pop all pending GENERATE EDB from etb queue
8402 while (m_etb_q.m_size) {
8403 m_etb_q.pop_entry(&p1,&p2,&ident);
8404 if (ident == OMX_COMPONENT_GENERATE_EBD) {
8405 pending_bd_q.insert_entry(p1,p2,ident);
8406 } else {
8407 tmp_q.insert_entry(p1,p2,ident);
8408 }
8409 }
8410 //return all non GENERATE FDB to etb queue
8411 while (tmp_q.m_size) {
8412 tmp_q.pop_entry(&p1,&p2,&ident);
8413 m_etb_q.insert_entry(p1,p2,ident);
8414 }
8415 pthread_mutex_unlock(&m_lock);
8416 // process all pending buffer dones
8417 while (pending_bd_q.m_size) {
8418 pending_bd_q.pop_entry(&p1,&p2,&ident);
8419 switch (ident) {
8420 case OMX_COMPONENT_GENERATE_EBD:
8421 if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008422 DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
Arun Menon906de572013-06-18 17:01:40 -07008423 omx_report_error ();
8424 }
8425 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008426
Arun Menon906de572013-06-18 17:01:40 -07008427 case OMX_COMPONENT_GENERATE_FBD:
8428 if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008429 DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
Arun Menon906de572013-06-18 17:01:40 -07008430 omx_report_error ();
8431 }
8432 break;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008433 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008434 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008435}
8436
8437void omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
8438{
Arun Menon906de572013-06-18 17:01:40 -07008439 OMX_U32 new_frame_interval = 0;
8440 if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
8441 && llabs(act_timestamp - prev_ts) > 2000) {
8442 new_frame_interval = client_set_fps ? frm_int :
8443 llabs(act_timestamp - prev_ts);
Arun Menond9e49f82014-04-23 18:50:26 -07008444 if (new_frame_interval != frm_int || frm_int == 0) {
Arun Menon906de572013-06-18 17:01:40 -07008445 frm_int = new_frame_interval;
8446 if (frm_int) {
8447 drv_ctx.frame_rate.fps_numerator = 1e6;
8448 drv_ctx.frame_rate.fps_denominator = frm_int;
8449 DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)",
8450 frm_int, drv_ctx.frame_rate.fps_numerator /
8451 (float)drv_ctx.frame_rate.fps_denominator);
Deva Ramasubramaniane47e05b2013-04-24 15:23:29 -07008452
Arun Menon906de572013-06-18 17:01:40 -07008453 /* We need to report the difference between this FBD and the previous FBD
8454 * back to the driver for clock scaling purposes. */
8455 struct v4l2_outputparm oparm;
8456 /*XXX: we're providing timing info as seconds per frame rather than frames
8457 * per second.*/
8458 oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
8459 oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
Deva Ramasubramaniane47e05b2013-04-24 15:23:29 -07008460
Arun Menon906de572013-06-18 17:01:40 -07008461 struct v4l2_streamparm sparm;
8462 sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
8463 sparm.parm.output = oparm;
8464 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
8465 DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
8466 performance might be affected");
8467 }
8468
8469 }
Deva Ramasubramaniane47e05b2013-04-24 15:23:29 -07008470 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008471 }
Arun Menon906de572013-06-18 17:01:40 -07008472 prev_ts = act_timestamp;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008473}
8474
8475void omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
8476{
Arun Menon906de572013-06-18 17:01:40 -07008477 if (rst_prev_ts && VALID_TS(act_timestamp)) {
8478 prev_ts = act_timestamp;
8479 rst_prev_ts = false;
8480 } else if (VALID_TS(prev_ts)) {
8481 bool codec_cond = (drv_ctx.timestamp_adjust)?
Deva Ramasubramanian5f3cff32014-12-04 17:13:01 -08008482 (!VALID_TS(act_timestamp) || act_timestamp < prev_ts || llabs(act_timestamp - prev_ts) <= 2000) :
8483 (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts);
Arun Menon906de572013-06-18 17:01:40 -07008484 if (frm_int > 0 && codec_cond) {
8485 DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
8486 act_timestamp = prev_ts + frm_int;
8487 DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
8488 prev_ts = act_timestamp;
Leena Winterrowdd139fdc2014-08-05 18:04:25 -07008489 } else {
8490 if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) {
8491 // ensure that timestamps can never step backwards when in display order
8492 act_timestamp = prev_ts;
8493 }
Arun Menon906de572013-06-18 17:01:40 -07008494 set_frame_rate(act_timestamp);
Leena Winterrowdd139fdc2014-08-05 18:04:25 -07008495 }
Arun Menon906de572013-06-18 17:01:40 -07008496 } else if (frm_int > 0) // In this case the frame rate was set along
8497 { // with the port definition, start ts with 0
8498 act_timestamp = prev_ts = 0; // and correct if a valid ts is received.
8499 rst_prev_ts = true;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008500 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008501}
8502
8503void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8504{
Arun Menon906de572013-06-18 17:01:40 -07008505 OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
8506 OMX_U32 num_conceal_MB = 0;
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +05308507 OMX_TICKS time_stamp = 0;
Arun Menon906de572013-06-18 17:01:40 -07008508 OMX_U32 frame_rate = 0;
8509 int consumed_len = 0;
8510 OMX_U32 num_MB_in_frame;
8511 OMX_U32 recovery_sei_flags = 1;
8512 int enable = 0;
Arun Menon7b6fd642014-02-13 16:48:36 -08008513
Arun Menon906de572013-06-18 17:01:40 -07008514 int buf_index = p_buf_hdr - m_out_mem_ptr;
Praveen Chavan61e5d162013-11-01 02:49:19 -07008515 if (buf_index >= drv_ctx.extradata_info.count) {
8516 DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)",
8517 buf_index, drv_ctx.extradata_info.count);
8518 return;
8519 }
Arun Menon906de572013-06-18 17:01:40 -07008520 struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
8521 OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
8522 p_buf_hdr->nOffset;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308523
Arun Menon906de572013-06-18 17:01:40 -07008524 if (!drv_ctx.extradata_info.uaddr) {
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308525 DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr");
Arun Menon906de572013-06-18 17:01:40 -07008526 return;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008527 }
Pushkaraj Patil74b2eaf2014-06-13 17:07:50 +05308528
8529 if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) {
8530 DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data");
8531 p_extra = NULL;
8532 return;
8533 }
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05308534 if (!secure_mode)
8535 p_extra = (OMX_OTHER_EXTRADATATYPE *)
Arun Menon906de572013-06-18 17:01:40 -07008536 ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05308537 else
8538 p_extra = m_other_extradata;
8539
Arun Menon906de572013-06-18 17:01:40 -07008540 char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
Pushkaraj Patil74b2eaf2014-06-13 17:07:50 +05308541 if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
8542 DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
Arun Menon906de572013-06-18 17:01:40 -07008543 p_extra = NULL;
Pushkaraj Patil74b2eaf2014-06-13 17:07:50 +05308544 return;
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008545 }
Arun Menon906de572013-06-18 17:01:40 -07008546 OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008547 if (data && p_extra) {
Arun Menon906de572013-06-18 17:01:40 -07008548 while ((consumed_len < drv_ctx.extradata_info.buffer_size)
8549 && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
Surajit Podderd2644d52013-08-28 17:59:06 +05308550 if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) {
Arun Menon906de572013-06-18 17:01:40 -07008551 DEBUG_PRINT_LOW("Invalid extra data size");
8552 break;
8553 }
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308554 DEBUG_PRINT_LOW("handle_extradata: eType = %d", data->eType);
Arun Menon906de572013-06-18 17:01:40 -07008555 switch ((unsigned long)data->eType) {
8556 case EXTRADATA_INTERLACE_VIDEO:
8557 struct msm_vidc_interlace_payload *payload;
8558 payload = (struct msm_vidc_interlace_payload *)data->data;
Arun Menon7b6fd642014-02-13 16:48:36 -08008559 if (payload) {
Praneeth Paladugudd29c282013-09-12 15:41:47 -07008560 enable = 1;
Arun Menon7b6fd642014-02-13 16:48:36 -08008561 switch (payload->format) {
8562 case INTERLACE_FRAME_PROGRESSIVE:
8563 drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
8564 enable = 0;
8565 break;
8566 case INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST:
8567 drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
8568 break;
8569 case INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST:
8570 drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
8571 break;
8572 default:
8573 DEBUG_PRINT_LOW("default case - set interlace to topfield");
8574 drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
8575 }
Arun Menon906de572013-06-18 17:01:40 -07008576 }
8577 if (m_enable_android_native_buffers)
8578 setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
8579 PP_PARAM_INTERLACED, (void*)&enable);
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +05308580 if (client_extradata & OMX_INTERLACE_EXTRADATA) {
Arun Menon7b6fd642014-02-13 16:48:36 -08008581 append_interlace_extradata(p_extra, payload->format,
8582 p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF);
Arun Menon906de572013-06-18 17:01:40 -07008583 p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8584 }
8585 break;
8586 case EXTRADATA_FRAME_RATE:
8587 struct msm_vidc_framerate_payload *frame_rate_payload;
8588 frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
8589 frame_rate = frame_rate_payload->frame_rate;
8590 break;
8591 case EXTRADATA_TIMESTAMP:
8592 struct msm_vidc_ts_payload *time_stamp_payload;
8593 time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +05308594 time_stamp = time_stamp_payload->timestamp_lo;
8595 time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
8596 p_buf_hdr->nTimeStamp = time_stamp;
Arun Menon906de572013-06-18 17:01:40 -07008597 break;
8598 case EXTRADATA_NUM_CONCEALED_MB:
8599 struct msm_vidc_concealmb_payload *conceal_mb_payload;
8600 conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
8601 num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
8602 (drv_ctx.video_resolution.frame_height + 15)) >> 8;
8603 num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
8604 break;
8605 case EXTRADATA_INDEX:
8606 int *etype;
8607 etype = (int *)(data->data);
8608 if (etype && *etype == EXTRADATA_ASPECT_RATIO) {
8609 struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
8610 aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
8611 if (aspect_ratio_payload) {
8612 ((struct vdec_output_frameinfo *)
8613 p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
8614 ((struct vdec_output_frameinfo *)
8615 p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
8616 }
8617 }
8618 break;
8619 case EXTRADATA_RECOVERY_POINT_SEI:
8620 struct msm_vidc_recoverysei_payload *recovery_sei_payload;
8621 recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
8622 recovery_sei_flags = recovery_sei_payload->flags;
8623 if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
8624 p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008625 DEBUG_PRINT_HIGH("");
8626 DEBUG_PRINT_HIGH("***************************************************");
8627 DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
8628 DEBUG_PRINT_HIGH("***************************************************");
Arun Menon906de572013-06-18 17:01:40 -07008629 }
8630 break;
8631 case EXTRADATA_PANSCAN_WINDOW:
8632 panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
8633 break;
8634 case EXTRADATA_MPEG2_SEQDISP:
8635 struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
8636 seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data->data;
8637 if (seqdisp_payload) {
8638 m_disp_hor_size = seqdisp_payload->disp_width;
8639 m_disp_vert_size = seqdisp_payload->disp_height;
8640 }
8641 break;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308642 case EXTRADATA_S3D_FRAME_PACKING:
8643 struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload;
8644 s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)data->data;
Srinu Gorle2eb94e42014-02-14 13:37:40 +05308645 if (client_extradata & OMX_FRAMEPACK_EXTRADATA) {
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308646 append_framepack_extradata(p_extra, s3d_frame_packing_payload);
8647 p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8648 }
8649 break;
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08008650 case EXTRADATA_FRAME_QP:
8651 struct msm_vidc_frame_qp_payload *qp_payload;
8652 qp_payload = (struct msm_vidc_frame_qp_payload*)data->data;
Srinu Gorle2eb94e42014-02-14 13:37:40 +05308653 if (client_extradata & OMX_QP_EXTRADATA) {
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08008654 append_qp_extradata(p_extra, qp_payload);
8655 p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8656 }
8657 break;
Jorge Solano Altamirano54338452014-01-08 11:04:57 -08008658 case EXTRADATA_FRAME_BITS_INFO:
8659 struct msm_vidc_frame_bits_info_payload *bits_info_payload;
8660 bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)data->data;
Srinu Gorle2eb94e42014-02-14 13:37:40 +05308661 if (client_extradata & OMX_BITSINFO_EXTRADATA) {
Jorge Solano Altamirano54338452014-01-08 11:04:57 -08008662 append_bitsinfo_extradata(p_extra, bits_info_payload);
8663 p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8664 }
8665 break;
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008666 case EXTRADATA_STREAM_USERDATA:
Pushkaraj Patil74b2eaf2014-06-13 17:07:50 +05308667 if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008668 append_user_extradata(p_extra, data);
8669 p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8670 }
8671 break;
Arun Menon906de572013-06-18 17:01:40 -07008672 default:
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008673 DEBUG_PRINT_LOW("Unrecognized extradata");
Arun Menon906de572013-06-18 17:01:40 -07008674 goto unrecognized_extradata;
8675 }
8676 consumed_len += data->nSize;
8677 data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
8678 }
Srinu Gorle2eb94e42014-02-14 13:37:40 +05308679 if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
Arun Menon906de572013-06-18 17:01:40 -07008680 p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8681 append_frame_info_extradata(p_extra,
8682 num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +05308683 time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
Arun Menon906de572013-06-18 17:01:40 -07008684 p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
Praneeth Paladugudd29c282013-09-12 15:41:47 -07008685 p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
Arun Menon906de572013-06-18 17:01:40 -07008686 }
8687 }
Vinay Kalia0e75e9a2012-09-27 15:41:53 -07008688unrecognized_extradata:
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008689 if (client_extradata && p_extra) {
8690 p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
Arun Menon906de572013-06-18 17:01:40 -07008691 append_terminator_extradata(p_extra);
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008692 }
8693
Arun Menonfd723932014-05-30 17:56:31 -07008694 if (secure_mode && p_extradata && m_other_extradata) {
Srinu Gorle2eb94e42014-02-14 13:37:40 +05308695 struct vdec_output_frameinfo *ptr_extradatabuff = NULL;
8696 memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size);
8697 ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate;
8698 ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata;
8699 ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size;
8700 }
Arun Menon906de572013-06-18 17:01:40 -07008701 return;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008702}
8703
Vinay Kalia9c00cae2012-12-06 16:08:20 -08008704OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
Arun Menon906de572013-06-18 17:01:40 -07008705 bool is_internal, bool enable)
Shalaj Jain273b3e02012-06-22 19:08:03 -07008706{
Arun Menon906de572013-06-18 17:01:40 -07008707 OMX_ERRORTYPE ret = OMX_ErrorNone;
8708 struct v4l2_control control;
8709 if (m_state != OMX_StateLoaded) {
8710 DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
8711 return OMX_ErrorIncorrectStateOperation;
Vinay Kaliadb90f8c2012-11-19 18:57:56 -08008712 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008713 DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d",
Arun Menon906de572013-06-18 17:01:40 -07008714 client_extradata, requested_extradata, enable, is_internal);
8715
8716 if (!is_internal) {
8717 if (enable)
8718 client_extradata |= requested_extradata;
8719 else
8720 client_extradata = client_extradata & ~requested_extradata;
8721 }
8722
8723 if (enable) {
8724 if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
8725 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8726 control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
8727 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
8728 DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008729 " Quality of interlaced clips might be impacted.");
Arun Menon906de572013-06-18 17:01:40 -07008730 }
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308731 }
8732 if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
Arun Menon906de572013-06-18 17:01:40 -07008733 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8734 control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
8735 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008736 DEBUG_PRINT_HIGH("Failed to set framerate extradata");
Arun Menon906de572013-06-18 17:01:40 -07008737 }
8738 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8739 control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
8740 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008741 DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
Arun Menon906de572013-06-18 17:01:40 -07008742 }
8743 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8744 control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
8745 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008746 DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
Arun Menon906de572013-06-18 17:01:40 -07008747 }
8748 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8749 control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
8750 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008751 DEBUG_PRINT_HIGH("Failed to set panscan extradata");
Arun Menon906de572013-06-18 17:01:40 -07008752 }
8753 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8754 control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
8755 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008756 DEBUG_PRINT_HIGH("Failed to set panscan extradata");
Arun Menon906de572013-06-18 17:01:40 -07008757 }
8758 if (output_capability == V4L2_PIX_FMT_MPEG2) {
8759 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8760 control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
8761 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008762 DEBUG_PRINT_HIGH("Failed to set panscan extradata");
Arun Menon906de572013-06-18 17:01:40 -07008763 }
8764 }
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308765 }
8766 if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
Arun Menon906de572013-06-18 17:01:40 -07008767 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8768 control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
8769 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008770 DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
Arun Menon906de572013-06-18 17:01:40 -07008771 }
8772 }
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308773 if (requested_extradata & OMX_FRAMEPACK_EXTRADATA) {
8774 if (output_capability == V4L2_PIX_FMT_H264) {
8775 DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA");
8776 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8777 control.value = V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING;
8778 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
8779 DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata");
8780 }
8781 } else {
8782 DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only");
8783 }
8784 }
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08008785 if (requested_extradata & OMX_QP_EXTRADATA) {
8786 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8787 control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
8788 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
8789 DEBUG_PRINT_HIGH("Failed to set QP extradata");
8790 }
8791 }
Jorge Solano Altamirano54338452014-01-08 11:04:57 -08008792 if (requested_extradata & OMX_BITSINFO_EXTRADATA) {
8793 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8794 control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO;
8795 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
8796 DEBUG_PRINT_HIGH("Failed to set frame bits info extradata");
8797 }
8798 }
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008799 if (requested_extradata & OMX_EXTNUSER_EXTRADATA) {
8800 control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
8801 control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA;
8802 if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
8803 DEBUG_PRINT_HIGH("Failed to set stream userdata extradata");
8804 }
8805 }
Arun Menon906de572013-06-18 17:01:40 -07008806 }
8807 ret = get_buffer_req(&drv_ctx.op_buf);
8808 return ret;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008809}
8810
8811OMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8812{
Arun Menon906de572013-06-18 17:01:40 -07008813 OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
8814 OMX_U8 *data_ptr = extra->data, data = 0;
8815 while (byte_count < extra->nDataSize) {
8816 data = *data_ptr;
8817 while (data) {
8818 num_MB += (data&0x01);
8819 data >>= 1;
8820 }
8821 data_ptr++;
8822 byte_count++;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008823 }
Arun Menon906de572013-06-18 17:01:40 -07008824 num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
8825 (drv_ctx.video_resolution.frame_height + 15)) >> 8;
8826 return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
Shalaj Jain273b3e02012-06-22 19:08:03 -07008827}
8828
8829void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8830{
Arun Menon906de572013-06-18 17:01:40 -07008831 if (!m_debug_extradata)
8832 return;
Shalaj Jain273b3e02012-06-22 19:08:03 -07008833
8834 DEBUG_PRINT_HIGH(
Deepak Verma867d5132013-12-05 12:23:20 +05308835 "============== Extra Data ==============\n"
8836 " Size: %lu\n"
8837 " Version: %lu\n"
8838 " PortIndex: %lu\n"
8839 " Type: %x\n"
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008840 " DataSize: %lu",
Arun Menon906de572013-06-18 17:01:40 -07008841 extra->nSize, extra->nVersion.nVersion,
8842 extra->nPortIndex, extra->eType, extra->nDataSize);
Shalaj Jain273b3e02012-06-22 19:08:03 -07008843
Arun Menon906de572013-06-18 17:01:40 -07008844 if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
8845 OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8846 DEBUG_PRINT_HIGH(
Deepak Verma867d5132013-12-05 12:23:20 +05308847 "------ Interlace Format ------\n"
8848 " Size: %lu\n"
8849 " Version: %lu\n"
8850 " PortIndex: %lu\n"
8851 " Is Interlace Format: %d\n"
8852 " Interlace Formats: %lu\n"
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008853 "=========== End of Interlace ===========",
Arun Menon906de572013-06-18 17:01:40 -07008854 intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
8855 intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
8856 } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
8857 OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8858
8859 DEBUG_PRINT_HIGH(
Deepak Verma867d5132013-12-05 12:23:20 +05308860 "-------- Frame Format --------\n"
8861 " Picture Type: %d\n"
8862 " Interlace Type: %d\n"
8863 " Pan Scan Total Frame Num: %lu\n"
8864 " Concealed Macro Blocks: %lu\n"
8865 " frame rate: %lu\n"
8866 " Time Stamp: %llu\n"
8867 " Aspect Ratio X: %lu\n"
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008868 " Aspect Ratio Y: %lu",
Arun Menon906de572013-06-18 17:01:40 -07008869 fminfo->ePicType,
8870 fminfo->interlaceType,
8871 fminfo->panScan.numWindows,
8872 fminfo->nConcealedMacroblocks,
8873 fminfo->nFrameRate,
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +05308874 fminfo->nTimeStamp,
Arun Menon906de572013-06-18 17:01:40 -07008875 fminfo->aspectRatio.aspectRatioX,
8876 fminfo->aspectRatio.aspectRatioY);
8877
8878 for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
8879 DEBUG_PRINT_HIGH(
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008880 "------------------------------"
Deepak Verma867d5132013-12-05 12:23:20 +05308881 " Pan Scan Frame Num: %lu\n"
8882 " Rectangle x: %ld\n"
8883 " Rectangle y: %ld\n"
8884 " Rectangle dx: %ld\n"
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07008885 " Rectangle dy: %ld",
Arun Menon906de572013-06-18 17:01:40 -07008886 i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
8887 fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
8888 }
8889
8890 DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05308891 } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) {
8892 OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)extra->data;
8893 DEBUG_PRINT_HIGH(
8894 "------------------ Framepack Format ----------\n"
8895 " id: %lu \n"
8896 " cancel_flag: %lu \n"
8897 " type: %lu \n"
8898 " quincunx_sampling_flagFormat: %lu \n"
8899 " content_interpretation_type: %lu \n"
8900 " content_interpretation_type: %lu \n"
8901 " spatial_flipping_flag: %lu \n"
8902 " frame0_flipped_flag: %lu \n"
8903 " field_views_flag: %lu \n"
8904 " current_frame_is_frame0_flag: %lu \n"
8905 " frame0_self_contained_flag: %lu \n"
8906 " frame1_self_contained_flag: %lu \n"
8907 " frame0_grid_position_x: %lu \n"
8908 " frame0_grid_position_y: %lu \n"
8909 " frame1_grid_position_x: %lu \n"
8910 " frame1_grid_position_y: %lu \n"
8911 " reserved_byte: %lu \n"
8912 " repetition_period: %lu \n"
8913 " extension_flag: %lu \n"
8914 "================== End of Framepack ===========",
8915 framepack->id,
8916 framepack->cancel_flag,
8917 framepack->type,
8918 framepack->quincunx_sampling_flag,
8919 framepack->content_interpretation_type,
8920 framepack->spatial_flipping_flag,
8921 framepack->frame0_flipped_flag,
8922 framepack->field_views_flag,
8923 framepack->current_frame_is_frame0_flag,
8924 framepack->frame0_self_contained_flag,
8925 framepack->frame1_self_contained_flag,
8926 framepack->frame0_grid_position_x,
8927 framepack->frame0_grid_position_y,
8928 framepack->frame1_grid_position_x,
8929 framepack->frame1_grid_position_y,
8930 framepack->reserved_byte,
8931 framepack->repetition_period,
8932 framepack->extension_flag);
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08008933 } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) {
8934 OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)extra->data;
8935 DEBUG_PRINT_HIGH(
8936 "---- QP (Frame quantization parameter) ----\n"
8937 " Frame QP: %lu \n"
8938 "================ End of QP ================\n",
8939 qp->nQP);
Jorge Solano Altamirano54338452014-01-08 11:04:57 -08008940 } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) {
8941 OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)extra->data;
8942 DEBUG_PRINT_HIGH(
8943 "--------- Input bits information --------\n"
8944 " Header bits: %lu \n"
8945 " Frame bits: %lu \n"
8946 "===== End of Input bits information =====\n",
8947 bits->header_bits, bits->frame_bits);
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08008948 } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) {
8949 OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)extra->data;
8950 OMX_U8 *data_ptr = (OMX_U8 *)userdata->data;
8951 OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type);
8952 OMX_U32 i = 0;
8953 DEBUG_PRINT_HIGH(
8954 "-------------- Userdata -------------\n"
8955 " Stream userdata type: %d\n"
8956 " userdata size: %d\n"
8957 " STREAM_USERDATA:",
8958 userdata->type, userdata_size);
8959 for (i = 0; i < userdata_size; i+=4) {
8960 DEBUG_PRINT_HIGH(" %x %x %x %x",
8961 data_ptr[i], data_ptr[i+1],
8962 data_ptr[i+2], data_ptr[i+3]);
8963 }
8964 DEBUG_PRINT_HIGH(
8965 "=========== End of Userdata ===========");
Arun Menon906de572013-06-18 17:01:40 -07008966 } else if (extra->eType == OMX_ExtraDataNone) {
8967 DEBUG_PRINT_HIGH("========== End of Terminator ===========");
8968 } else {
8969 DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
Shalaj Jain273b3e02012-06-22 19:08:03 -07008970 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07008971}
8972
8973void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
Arun Menon7b6fd642014-02-13 16:48:36 -08008974 OMX_U32 interlaced_format_type, bool is_mbaff)
Shalaj Jain273b3e02012-06-22 19:08:03 -07008975{
Arun Menon906de572013-06-18 17:01:40 -07008976 OMX_STREAMINTERLACEFORMAT *interlace_format;
Arun Menon7b6fd642014-02-13 16:48:36 -08008977
Arun Menon906de572013-06-18 17:01:40 -07008978 if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
8979 return;
8980 }
8981 extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
8982 extra->nVersion.nVersion = OMX_SPEC_VERSION;
8983 extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8984 extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
8985 extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8986 interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8987 interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8988 interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
8989 interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
Arun Menon7b6fd642014-02-13 16:48:36 -08008990
8991 if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE) && !is_mbaff) {
Arun Menon906de572013-06-18 17:01:40 -07008992 interlace_format->bInterlaceFormat = OMX_FALSE;
8993 interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
8994 drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
Arun Menon7b6fd642014-02-13 16:48:36 -08008995 } else if ((interlaced_format_type == INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) && !is_mbaff) {
Praneeth Paladugudd29c282013-09-12 15:41:47 -07008996 interlace_format->bInterlaceFormat = OMX_TRUE;
Arun Menon7b6fd642014-02-13 16:48:36 -08008997 interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
Praneeth Paladugudd29c282013-09-12 15:41:47 -07008998 drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
Arun Menon7b6fd642014-02-13 16:48:36 -08008999 } else if ((interlaced_format_type == INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) && !is_mbaff) {
Praneeth Paladugudd29c282013-09-12 15:41:47 -07009000 interlace_format->bInterlaceFormat = OMX_TRUE;
Arun Menon7b6fd642014-02-13 16:48:36 -08009001 interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst;
Praneeth Paladugudd29c282013-09-12 15:41:47 -07009002 drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
Arun Menon906de572013-06-18 17:01:40 -07009003 } else {
9004 interlace_format->bInterlaceFormat = OMX_TRUE;
9005 interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
9006 drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
9007 }
9008 print_debug_extradata(extra);
Shalaj Jain273b3e02012-06-22 19:08:03 -07009009}
9010
Praneeth Paladuguf3a492b2013-01-03 17:35:34 -08009011void omx_vdec::fill_aspect_ratio_info(
Arun Menon906de572013-06-18 17:01:40 -07009012 struct vdec_aspectratioinfo *aspect_ratio_info,
9013 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
Praneeth Paladuguf3a492b2013-01-03 17:35:34 -08009014{
Arun Menon906de572013-06-18 17:01:40 -07009015 m_extradata = frame_info;
9016 m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
9017 m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +05309018 DEBUG_PRINT_LOW("aspectRatioX %lu aspectRatioY %lu", m_extradata->aspectRatio.aspectRatioX,
Arun Menon906de572013-06-18 17:01:40 -07009019 m_extradata->aspectRatio.aspectRatioY);
Praneeth Paladuguf3a492b2013-01-03 17:35:34 -08009020}
Shalaj Jain273b3e02012-06-22 19:08:03 -07009021
9022void omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
Arun Menon906de572013-06-18 17:01:40 -07009023 OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +05309024 OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload,
Praneeth Paladuguf3a492b2013-01-03 17:35:34 -08009025 struct vdec_aspectratioinfo *aspect_ratio_info)
Shalaj Jain273b3e02012-06-22 19:08:03 -07009026{
Arun Menon906de572013-06-18 17:01:40 -07009027 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
9028 struct msm_vidc_panscan_window *panscan_window;
9029 if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
Praneeth Paladugu48a9a8a2012-12-06 12:12:19 -08009030 return;
Praneeth Paladugud0881ef2013-04-23 23:02:55 -07009031 }
Arun Menon906de572013-06-18 17:01:40 -07009032 extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
9033 extra->nVersion.nVersion = OMX_SPEC_VERSION;
9034 extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9035 extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
9036 extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
9037 frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
9038 switch (picture_type) {
9039 case PICTURE_TYPE_I:
9040 frame_info->ePicType = OMX_VIDEO_PictureTypeI;
9041 break;
9042 case PICTURE_TYPE_P:
9043 frame_info->ePicType = OMX_VIDEO_PictureTypeP;
9044 break;
9045 case PICTURE_TYPE_B:
9046 frame_info->ePicType = OMX_VIDEO_PictureTypeB;
9047 break;
9048 default:
9049 frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
9050 }
9051 if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
9052 frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
9053 else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
9054 frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
9055 else
9056 frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
9057 memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
9058 frame_info->nConcealedMacroblocks = num_conceal_mb;
9059 frame_info->nFrameRate = frame_rate;
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +05309060 frame_info->nTimeStamp = time_stamp;
Arun Menon906de572013-06-18 17:01:40 -07009061 frame_info->panScan.numWindows = 0;
9062 if (output_capability == V4L2_PIX_FMT_MPEG2) {
9063 if (m_disp_hor_size && m_disp_vert_size) {
9064 frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
9065 frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
Pushkaraj Patil5e6ebd92014-03-10 10:29:14 +05309066 } else {
9067 frame_info->displayAspectRatio.displayHorizontalSize = 0;
9068 frame_info->displayAspectRatio.displayVerticalSize = 0;
Arun Menon906de572013-06-18 17:01:40 -07009069 }
9070 }
Praneeth Paladugud0881ef2013-04-23 23:02:55 -07009071
Arun Menon906de572013-06-18 17:01:40 -07009072 if (panscan_payload) {
9073 frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
9074 panscan_window = &panscan_payload->wnd[0];
9075 for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
9076 frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
9077 frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
9078 frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
9079 frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
9080 panscan_window++;
9081 }
Praneeth Paladugu48a9a8a2012-12-06 12:12:19 -08009082 }
Arun Menon906de572013-06-18 17:01:40 -07009083 fill_aspect_ratio_info(aspect_ratio_info, frame_info);
9084 print_debug_extradata(extra);
Shalaj Jain273b3e02012-06-22 19:08:03 -07009085}
9086
9087void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
9088{
Arun Menon906de572013-06-18 17:01:40 -07009089 OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
9090 extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
9091 extra->nVersion.nVersion = OMX_SPEC_VERSION;
9092 extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9093 extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
9094 extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
9095 portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
9096 *portDefn = m_port_def;
9097 DEBUG_PRINT_LOW("append_portdef_extradata height = %lu width = %lu "
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009098 "stride = %lu sliceheight = %lu",portDefn->format.video.nFrameHeight,
Arun Menon906de572013-06-18 17:01:40 -07009099 portDefn->format.video.nFrameWidth,
9100 portDefn->format.video.nStride,
9101 portDefn->format.video.nSliceHeight);
Shalaj Jain273b3e02012-06-22 19:08:03 -07009102}
9103
Maheshwar Ajjad2df2182013-10-24 19:20:34 +05309104void omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
9105 struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload)
9106{
9107 OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack;
9108 if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) {
9109 DEBUG_PRINT_ERROR("frame packing size mismatch");
9110 return;
9111 }
9112 extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE;
9113 extra->nVersion.nVersion = OMX_SPEC_VERSION;
9114 extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9115 extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement;
9116 extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
9117 framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)extra->data;
9118 framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
9119 framepack->nVersion.nVersion = OMX_SPEC_VERSION;
9120 framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9121 memcpy(&framepack->id, s3d_frame_packing_payload,
9122 sizeof(struct msm_vidc_s3d_frame_packing_payload));
9123 memcpy(&m_frame_pack_arrangement, framepack,
9124 sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
9125 print_debug_extradata(extra);
9126}
9127
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -08009128void omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
9129 struct msm_vidc_frame_qp_payload *qp_payload)
9130{
9131 OMX_QCOM_EXTRADATA_QP * qp = NULL;
9132 if (!qp_payload) {
9133 DEBUG_PRINT_ERROR("QP payload is NULL");
9134 return;
9135 }
9136 extra->nSize = OMX_QP_EXTRADATA_SIZE;
9137 extra->nVersion.nVersion = OMX_SPEC_VERSION;
9138 extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9139 extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP;
9140 extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP);
9141 qp = (OMX_QCOM_EXTRADATA_QP *)extra->data;
9142 qp->nQP = qp_payload->frame_qp;
9143 print_debug_extradata(extra);
9144}
9145
Jorge Solano Altamirano54338452014-01-08 11:04:57 -08009146void omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
9147 struct msm_vidc_frame_bits_info_payload *bits_payload)
9148{
9149 OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL;
9150 if (!bits_payload) {
9151 DEBUG_PRINT_ERROR("bits info payload is NULL");
9152 return;
9153 }
9154 extra->nSize = OMX_BITSINFO_EXTRADATA_SIZE;
9155 extra->nVersion.nVersion = OMX_SPEC_VERSION;
9156 extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9157 extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo;
9158 extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO);
9159 bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)extra->data;
9160 bits->frame_bits = bits_payload->frame_bits;
9161 bits->header_bits = bits_payload->header_bits;
9162 print_debug_extradata(extra);
9163}
9164
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08009165void omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra,
9166 OMX_OTHER_EXTRADATATYPE *p_user)
9167{
9168 int userdata_size = 0;
9169 struct msm_vidc_stream_userdata_payload *userdata_payload = NULL;
9170 userdata_payload =
9171 (struct msm_vidc_stream_userdata_payload *)p_user->data;
9172 userdata_size = p_user->nDataSize;
Deva Ramasubramanian2ebfed32014-04-24 13:34:24 -07009173 extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + p_user->nSize;
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -08009174 extra->nVersion.nVersion = OMX_SPEC_VERSION;
9175 extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9176 extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData;
9177 extra->nDataSize = userdata_size;
9178 if (extra->data && p_user->data && extra->nDataSize)
9179 memcpy(extra->data, p_user->data, extra->nDataSize);
9180 print_debug_extradata(extra);
9181}
9182
Shalaj Jain273b3e02012-06-22 19:08:03 -07009183void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
9184{
Arun Menon906de572013-06-18 17:01:40 -07009185 if (!client_extradata) {
9186 return;
9187 }
9188 extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
9189 extra->nVersion.nVersion = OMX_SPEC_VERSION;
9190 extra->eType = OMX_ExtraDataNone;
9191 extra->nDataSize = 0;
9192 extra->data[0] = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009193
Arun Menon906de572013-06-18 17:01:40 -07009194 print_debug_extradata(extra);
Shalaj Jain273b3e02012-06-22 19:08:03 -07009195}
9196
9197OMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index)
9198{
Arun Menon906de572013-06-18 17:01:40 -07009199 OMX_ERRORTYPE eRet = OMX_ErrorNone;
9200 if (index >= drv_ctx.ip_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009201 DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
Arun Menon906de572013-06-18 17:01:40 -07009202 return OMX_ErrorInsufficientResources;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009203 }
Arun Menon906de572013-06-18 17:01:40 -07009204 if (m_desc_buffer_ptr == NULL) {
9205 m_desc_buffer_ptr = (desc_buffer_hdr*) \
9206 calloc( (sizeof(desc_buffer_hdr)),
9207 drv_ctx.ip_buf.actualcount);
9208 if (m_desc_buffer_ptr == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009209 DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
Arun Menon906de572013-06-18 17:01:40 -07009210 return OMX_ErrorInsufficientResources;
9211 }
9212 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07009213
Arun Menon906de572013-06-18 17:01:40 -07009214 m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
9215 if (m_desc_buffer_ptr[index].buf_addr == NULL) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009216 DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
Arun Menon906de572013-06-18 17:01:40 -07009217 return OMX_ErrorInsufficientResources;
9218 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07009219
Arun Menon906de572013-06-18 17:01:40 -07009220 return eRet;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009221}
9222
9223void omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
9224{
Arun Menon906de572013-06-18 17:01:40 -07009225 DEBUG_PRINT_LOW("Inserting address offset (%lu) at idx (%lu)", address_offset,m_demux_entries);
9226 if (m_demux_entries < 8192) {
9227 m_demux_offsets[m_demux_entries++] = address_offset;
9228 }
9229 return;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009230}
9231
9232void omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
9233{
Arun Menon906de572013-06-18 17:01:40 -07009234 OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
9235 OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
9236 OMX_U32 index = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009237
Arun Menon906de572013-06-18 17:01:40 -07009238 m_demux_entries = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009239
Arun Menon906de572013-06-18 17:01:40 -07009240 while (index < bytes_to_parse) {
9241 if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
9242 (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
9243 ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
9244 (buf[index+2] == 0x01)) ) {
9245 //Found start code, insert address offset
9246 insert_demux_addr_offset(index);
9247 if (buf[index+2] == 0x01) // 3 byte start code
9248 index += 3;
9249 else //4 byte start code
9250 index += 4;
9251 } else
9252 index++;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009253 }
Arun Menon906de572013-06-18 17:01:40 -07009254 DEBUG_PRINT_LOW("Extracted (%lu) demux entry offsets",m_demux_entries);
9255 return;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009256}
9257
9258OMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
9259{
Arun Menon906de572013-06-18 17:01:40 -07009260 //fix this, handle 3 byte start code, vc1 terminator entry
9261 OMX_U8 *p_demux_data = NULL;
9262 OMX_U32 desc_data = 0;
9263 OMX_U32 start_addr = 0;
9264 OMX_U32 nal_size = 0;
9265 OMX_U32 suffix_byte = 0;
9266 OMX_U32 demux_index = 0;
9267 OMX_U32 buffer_index = 0;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009268
Arun Menon906de572013-06-18 17:01:40 -07009269 if (m_desc_buffer_ptr == NULL) {
9270 DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
9271 return OMX_ErrorBadParameter;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009272 }
Shalaj Jain273b3e02012-06-22 19:08:03 -07009273
Arun Menon906de572013-06-18 17:01:40 -07009274 buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
9275 if (buffer_index > drv_ctx.ip_buf.actualcount) {
9276 DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
9277 return OMX_ErrorBadParameter;
9278 }
9279
9280 p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
9281
9282 if ( ((OMX_U8*)p_demux_data == NULL) ||
9283 ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
9284 DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
9285 return OMX_ErrorBadParameter;
9286 } else {
9287 for (; demux_index < m_demux_entries; demux_index++) {
9288 desc_data = 0;
9289 start_addr = m_demux_offsets[demux_index];
9290 if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
9291 suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
9292 } else {
9293 suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
9294 }
9295 if (demux_index < (m_demux_entries - 1)) {
9296 nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
9297 } else {
9298 nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
9299 }
9300 DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%lx),nal_size(%lu),demux_index(%lu)",
9301 (void *)start_addr,
9302 suffix_byte,
9303 nal_size,
9304 demux_index);
9305 desc_data = (start_addr >> 3) << 1;
9306 desc_data |= (start_addr & 7) << 21;
9307 desc_data |= suffix_byte << 24;
9308
9309 memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
9310 memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
9311 memset(p_demux_data + 8, 0, sizeof(OMX_U32));
9312 memset(p_demux_data + 12, 0, sizeof(OMX_U32));
9313
9314 p_demux_data += 16;
9315 }
9316 if (codec_type_parse == CODEC_TYPE_VC1) {
9317 DEBUG_PRINT_LOW("VC1 terminator entry");
9318 desc_data = 0;
9319 desc_data = 0x82 << 24;
9320 memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
9321 memset(p_demux_data + 4, 0, sizeof(OMX_U32));
9322 memset(p_demux_data + 8, 0, sizeof(OMX_U32));
9323 memset(p_demux_data + 12, 0, sizeof(OMX_U32));
9324 p_demux_data += 16;
9325 m_demux_entries++;
9326 }
9327 //Add zero word to indicate end of descriptors
9328 memset(p_demux_data, 0, sizeof(OMX_U32));
9329
9330 m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
9331 DEBUG_PRINT_LOW("desc table data size=%lu", m_desc_buffer_ptr[buffer_index].desc_data_size);
9332 }
9333 memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
9334 m_demux_entries = 0;
9335 DEBUG_PRINT_LOW("Demux table complete!");
9336 return OMX_ErrorNone;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009337}
9338
Deva Ramasubramanian9403f022012-11-28 18:27:53 -08009339OMX_ERRORTYPE omx_vdec::createDivxDrmContext()
Shalaj Jain273b3e02012-06-22 19:08:03 -07009340{
Arun Menon906de572013-06-18 17:01:40 -07009341 OMX_ERRORTYPE err = OMX_ErrorNone;
9342 iDivXDrmDecrypt = DivXDrmDecrypt::Create();
9343 if (iDivXDrmDecrypt) {
9344 OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
9345 if (err!=OMX_ErrorNone) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009346 DEBUG_PRINT_ERROR("ERROR :iDivXDrmDecrypt->Init %d", err);
Shalaj Jain273b3e02012-06-22 19:08:03 -07009347 delete iDivXDrmDecrypt;
9348 iDivXDrmDecrypt = NULL;
Arun Menon906de572013-06-18 17:01:40 -07009349 }
9350 } else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009351 DEBUG_PRINT_ERROR("Unable to Create DIVX DRM");
Arun Menon906de572013-06-18 17:01:40 -07009352 err = OMX_ErrorUndefined;
9353 }
9354 return err;
Shalaj Jain273b3e02012-06-22 19:08:03 -07009355}
Shalaj Jain273b3e02012-06-22 19:08:03 -07009356
Vinay Kaliada4f4422013-01-09 10:45:03 -08009357omx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
9358{
Arun Menon906de572013-06-18 17:01:40 -07009359 enabled = false;
9360 omx = NULL;
9361 init_members();
9362 ColorFormat = OMX_COLOR_FormatMax;
Praveen Chavandb7776f2014-02-06 18:17:25 -08009363 dest_format = YCbCr420P;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009364}
9365
9366void omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
9367{
Arun Menon906de572013-06-18 17:01:40 -07009368 omx = reinterpret_cast<omx_vdec*>(client);
Vinay Kaliada4f4422013-01-09 10:45:03 -08009369}
9370
Arun Menon906de572013-06-18 17:01:40 -07009371void omx_vdec::allocate_color_convert_buf::init_members()
9372{
9373 allocated_count = 0;
9374 buffer_size_req = 0;
9375 buffer_alignment_req = 0;
9376 memset(m_platform_list_client,0,sizeof(m_platform_list_client));
9377 memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
9378 memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
9379 memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
Vinay Kaliada4f4422013-01-09 10:45:03 -08009380#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07009381 memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
Vinay Kaliada4f4422013-01-09 10:45:03 -08009382#endif
Arun Menon906de572013-06-18 17:01:40 -07009383 for (int i = 0; i < MAX_COUNT; i++)
9384 pmem_fd[i] = -1;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009385}
9386
Arun Menon906de572013-06-18 17:01:40 -07009387omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
9388{
9389 c2d.destroy();
Vinay Kaliada4f4422013-01-09 10:45:03 -08009390}
9391
9392bool omx_vdec::allocate_color_convert_buf::update_buffer_req()
9393{
Arun Menon906de572013-06-18 17:01:40 -07009394 bool status = true;
9395 unsigned int src_size = 0, destination_size = 0;
9396 OMX_COLOR_FORMATTYPE drv_color_format;
9397 if (!omx) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009398 DEBUG_PRINT_ERROR("Invalid client in color convert");
Arun Menon906de572013-06-18 17:01:40 -07009399 return false;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009400 }
Arun Menon906de572013-06-18 17:01:40 -07009401 if (!enabled) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009402 DEBUG_PRINT_HIGH("No color conversion required");
Arun Menon906de572013-06-18 17:01:40 -07009403 return status;
9404 }
9405 pthread_mutex_lock(&omx->c_lock);
9406 if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
9407 ColorFormat != OMX_COLOR_FormatYUV420Planar) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009408 DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
Arun Menon906de572013-06-18 17:01:40 -07009409 status = false;
9410 goto fail_update_buf_req;
9411 }
9412 c2d.close();
9413 status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
9414 omx->drv_ctx.video_resolution.frame_width,
Praveen Chavandb7776f2014-02-06 18:17:25 -08009415 NV12_128m,dest_format);
Arun Menon906de572013-06-18 17:01:40 -07009416 if (status) {
9417 status = c2d.get_buffer_size(C2D_INPUT,src_size);
9418 if (status)
9419 status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
9420 }
9421 if (status) {
9422 if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
9423 !destination_size) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009424 DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
Arun Menon906de572013-06-18 17:01:40 -07009425 "driver size %d destination size %d",
9426 src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
9427 status = false;
9428 c2d.close();
9429 buffer_size_req = 0;
9430 } else {
9431 buffer_size_req = destination_size;
9432 if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
9433 buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
9434 if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
9435 buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
9436 }
9437 }
Praneeth Paladuguf6995272013-02-04 14:03:56 -08009438fail_update_buf_req:
Arun Menon906de572013-06-18 17:01:40 -07009439 pthread_mutex_unlock(&omx->c_lock);
9440 return status;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009441}
9442
9443bool omx_vdec::allocate_color_convert_buf::set_color_format(
Arun Menon906de572013-06-18 17:01:40 -07009444 OMX_COLOR_FORMATTYPE dest_color_format)
Vinay Kaliada4f4422013-01-09 10:45:03 -08009445{
Arun Menon906de572013-06-18 17:01:40 -07009446 bool status = true;
9447 OMX_COLOR_FORMATTYPE drv_color_format;
9448 if (!omx) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009449 DEBUG_PRINT_ERROR("Invalid client in color convert");
Arun Menon906de572013-06-18 17:01:40 -07009450 return false;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009451 }
Arun Menon906de572013-06-18 17:01:40 -07009452 pthread_mutex_lock(&omx->c_lock);
9453 if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
9454 drv_color_format = (OMX_COLOR_FORMATTYPE)
9455 QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
9456 else {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009457 DEBUG_PRINT_ERROR("Incorrect color format");
Arun Menon906de572013-06-18 17:01:40 -07009458 status = false;
9459 }
9460 if (status && (drv_color_format != dest_color_format)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009461 DEBUG_PRINT_LOW("Enabling C2D");
Praveen Chavandb7776f2014-02-06 18:17:25 -08009462 if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) &&
9463 (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009464 DEBUG_PRINT_ERROR("Unsupported color format for c2d");
Arun Menon906de572013-06-18 17:01:40 -07009465 status = false;
9466 } else {
Praveen Chavandb7776f2014-02-06 18:17:25 -08009467 ColorFormat = dest_color_format;
9468 dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ?
9469 YCbCr420P : YCbCr420SP;
Arun Menon906de572013-06-18 17:01:40 -07009470 if (enabled)
9471 c2d.destroy();
9472 enabled = false;
9473 if (!c2d.init()) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009474 DEBUG_PRINT_ERROR("open failed for c2d");
Arun Menon906de572013-06-18 17:01:40 -07009475 status = false;
9476 } else
9477 enabled = true;
9478 }
9479 } else {
9480 if (enabled)
9481 c2d.destroy();
9482 enabled = false;
9483 }
9484 pthread_mutex_unlock(&omx->c_lock);
9485 return status;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009486}
9487
9488OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
9489{
Arun Menon906de572013-06-18 17:01:40 -07009490 if (!omx) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009491 DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
Arun Menon906de572013-06-18 17:01:40 -07009492 return NULL;
Praneeth Paladuguf6995272013-02-04 14:03:56 -08009493 }
Arun Menon906de572013-06-18 17:01:40 -07009494 if (!enabled)
9495 return omx->m_out_mem_ptr;
9496 return m_out_mem_ptr_client;
9497}
9498
9499 OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
9500(OMX_BUFFERHEADERTYPE *bufadd)
9501{
9502 if (!omx) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009503 DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
Arun Menon906de572013-06-18 17:01:40 -07009504 return NULL;
9505 }
9506 if (!enabled)
9507 return bufadd;
9508
9509 unsigned index = 0;
9510 index = bufadd - omx->m_out_mem_ptr;
9511 if (index < omx->drv_ctx.op_buf.actualcount) {
9512 m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
9513 m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
9514 bool status;
9515 if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
9516 pthread_mutex_lock(&omx->c_lock);
9517 status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
9518 omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
9519 pmem_baseaddress[index], pmem_baseaddress[index]);
Arun Menon906de572013-06-18 17:01:40 -07009520 if (!status) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009521 DEBUG_PRINT_ERROR("Failed color conversion %d", status);
Arun Menon906de572013-06-18 17:01:40 -07009522 m_out_mem_ptr_client[index].nFilledLen = 0;
Leena Winterrowd270a7042014-09-30 13:05:55 -07009523 pthread_mutex_unlock(&omx->c_lock);
Arun Menon906de572013-06-18 17:01:40 -07009524 return &m_out_mem_ptr_client[index];
Praveen Chavan6d6b7252014-09-15 17:05:54 -07009525 } else {
9526 unsigned int filledLen = 0;
9527 c2d.get_output_filled_length(filledLen);
9528 m_out_mem_ptr_client[index].nFilledLen = filledLen;
Arun Menon906de572013-06-18 17:01:40 -07009529 }
Leena Winterrowd270a7042014-09-30 13:05:55 -07009530 pthread_mutex_unlock(&omx->c_lock);
Arun Menon906de572013-06-18 17:01:40 -07009531 } else
9532 m_out_mem_ptr_client[index].nFilledLen = 0;
9533 return &m_out_mem_ptr_client[index];
9534 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009535 DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
Arun Menon906de572013-06-18 17:01:40 -07009536 return NULL;
9537}
9538
9539 OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
9540(OMX_BUFFERHEADERTYPE *bufadd)
9541{
9542 if (!omx) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009543 DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
Arun Menon906de572013-06-18 17:01:40 -07009544 return NULL;
9545 }
9546 if (!enabled)
9547 return bufadd;
9548 unsigned index = 0;
9549 index = bufadd - m_out_mem_ptr_client;
9550 if (index < omx->drv_ctx.op_buf.actualcount) {
9551 return &omx->m_out_mem_ptr[index];
9552 }
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009553 DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
Arun Menon906de572013-06-18 17:01:40 -07009554 return NULL;
9555}
9556 bool omx_vdec::allocate_color_convert_buf::get_buffer_req
9557(unsigned int &buffer_size)
9558{
9559 bool status = true;
9560 pthread_mutex_lock(&omx->c_lock);
9561 if (!enabled)
Vinay Kaliada4f4422013-01-09 10:45:03 -08009562 buffer_size = omx->drv_ctx.op_buf.buffer_size;
Arun Menon906de572013-06-18 17:01:40 -07009563 else {
9564 if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009565 DEBUG_PRINT_ERROR("Get buffer size failed");
Arun Menon906de572013-06-18 17:01:40 -07009566 status = false;
9567 goto fail_get_buffer_size;
9568 }
9569 }
9570 if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
9571 buffer_size = omx->drv_ctx.op_buf.buffer_size;
9572 if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
9573 buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
Praneeth Paladuguf6995272013-02-04 14:03:56 -08009574fail_get_buffer_size:
Arun Menon906de572013-06-18 17:01:40 -07009575 pthread_mutex_unlock(&omx->c_lock);
9576 return status;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009577}
9578OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
Arun Menon906de572013-06-18 17:01:40 -07009579 OMX_BUFFERHEADERTYPE *bufhdr)
9580{
9581 unsigned int index = 0;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009582
Arun Menon906de572013-06-18 17:01:40 -07009583 if (!enabled)
9584 return omx->free_output_buffer(bufhdr);
9585 if (enabled && omx->is_component_secure())
9586 return OMX_ErrorNone;
9587 if (!allocated_count || !bufhdr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009588 DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
Arun Menon906de572013-06-18 17:01:40 -07009589 return OMX_ErrorBadParameter;
9590 }
9591 index = bufhdr - m_out_mem_ptr_client;
9592 if (index >= omx->drv_ctx.op_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009593 DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
Arun Menon906de572013-06-18 17:01:40 -07009594 return OMX_ErrorBadParameter;
9595 }
9596 if (pmem_fd[index] > 0) {
9597 munmap(pmem_baseaddress[index], buffer_size_req);
9598 close(pmem_fd[index]);
9599 }
9600 pmem_fd[index] = -1;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009601#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07009602 omx->free_ion_memory(&op_buf_ion_info[index]);
Vinay Kaliada4f4422013-01-09 10:45:03 -08009603#endif
Arun Menon906de572013-06-18 17:01:40 -07009604 m_heap_ptr[index].video_heap_ptr = NULL;
9605 if (allocated_count > 0)
9606 allocated_count--;
9607 else
9608 allocated_count = 0;
9609 if (!allocated_count) {
9610 pthread_mutex_lock(&omx->c_lock);
9611 c2d.close();
9612 init_members();
9613 pthread_mutex_unlock(&omx->c_lock);
9614 }
9615 return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
Vinay Kaliada4f4422013-01-09 10:45:03 -08009616}
9617
9618OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
Arun Menon906de572013-06-18 17:01:40 -07009619 OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
Vinay Kaliada4f4422013-01-09 10:45:03 -08009620{
Arun Menon906de572013-06-18 17:01:40 -07009621 OMX_ERRORTYPE eRet = OMX_ErrorNone;
9622 if (!enabled) {
9623 eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
9624 return eRet;
9625 }
9626 if (enabled && omx->is_component_secure()) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009627 DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
Arun Menon906de572013-06-18 17:01:40 -07009628 omx->is_component_secure());
9629 return OMX_ErrorUnsupportedSetting;
9630 }
9631 if (!bufferHdr || bytes > buffer_size_req) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009632 DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
9633 DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu",
Arun Menon906de572013-06-18 17:01:40 -07009634 buffer_size_req,bytes);
9635 return OMX_ErrorBadParameter;
9636 }
9637 if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009638 DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
Arun Menon906de572013-06-18 17:01:40 -07009639 return OMX_ErrorInsufficientResources;
9640 }
9641 OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
9642 eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
9643 port,appData,omx->drv_ctx.op_buf.buffer_size);
9644 if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009645 DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
Arun Menon906de572013-06-18 17:01:40 -07009646 return eRet;
9647 }
9648 if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
Surajit Podderd2644d52013-08-28 17:59:06 +05309649 (int)omx->drv_ctx.op_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009650 DEBUG_PRINT_ERROR("Invalid header index %d",
Arun Menon906de572013-06-18 17:01:40 -07009651 (temp_bufferHdr - omx->m_out_mem_ptr));
9652 return OMX_ErrorUndefined;
9653 }
9654 unsigned int i = allocated_count;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009655#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -07009656 op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
9657 buffer_size_req,buffer_alignment_req,
9658 &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
9659 0);
9660 pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
9661 if (op_buf_ion_info[i].ion_device_fd < 0) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009662 DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
Arun Menon906de572013-06-18 17:01:40 -07009663 return OMX_ErrorInsufficientResources;
9664 }
9665 pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
9666 PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
Vinay Kaliada4f4422013-01-09 10:45:03 -08009667
Arun Menon906de572013-06-18 17:01:40 -07009668 if (pmem_baseaddress[i] == MAP_FAILED) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009669 DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
Arun Menon906de572013-06-18 17:01:40 -07009670 close(pmem_fd[i]);
9671 omx->free_ion_memory(&op_buf_ion_info[i]);
9672 return OMX_ErrorInsufficientResources;
9673 }
9674 m_heap_ptr[i].video_heap_ptr = new VideoHeap (
9675 op_buf_ion_info[i].ion_device_fd,buffer_size_req,
9676 pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
Vinay Kaliada4f4422013-01-09 10:45:03 -08009677#endif
Arun Menon906de572013-06-18 17:01:40 -07009678 m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
9679 m_pmem_info_client[i].offset = 0;
9680 m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
9681 m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
9682 m_platform_list_client[i].nEntries = 1;
9683 m_platform_list_client[i].entryList = &m_platform_entry_client[i];
9684 m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
9685 m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
9686 m_out_mem_ptr_client[i].nFilledLen = 0;
9687 m_out_mem_ptr_client[i].nFlags = 0;
9688 m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9689 m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
9690 m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
9691 m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
9692 m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
9693 m_out_mem_ptr_client[i].pAppPrivate = appData;
9694 *bufferHdr = &m_out_mem_ptr_client[i];
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009695 DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr);
Arun Menon906de572013-06-18 17:01:40 -07009696 allocated_count++;
9697 return eRet;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009698}
9699
9700bool omx_vdec::is_component_secure()
9701{
Arun Menon906de572013-06-18 17:01:40 -07009702 return secure_mode;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009703}
9704
9705bool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
9706{
Arun Menon906de572013-06-18 17:01:40 -07009707 bool status = true;
9708 if (!enabled) {
9709 if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
9710 dest_color_format = (OMX_COLOR_FORMATTYPE)
9711 QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
9712 else
9713 status = false;
9714 } else {
Praveen Chavandb7776f2014-02-06 18:17:25 -08009715 if (ColorFormat == OMX_COLOR_FormatYUV420Planar ||
9716 ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
9717 dest_color_format = ColorFormat;
Arun Menon906de572013-06-18 17:01:40 -07009718 } else
Praveen Chavandb7776f2014-02-06 18:17:25 -08009719 status = false;
Arun Menon906de572013-06-18 17:01:40 -07009720 }
9721 return status;
Vinay Kaliada4f4422013-01-09 10:45:03 -08009722}
Arun Menonbdb80b02013-08-12 17:45:54 -07009723
Arun Menonbdb80b02013-08-12 17:45:54 -07009724void omx_vdec::buf_ref_add(OMX_U32 fd, OMX_U32 offset)
9725{
9726 int i = 0;
9727 bool buf_present = false;
9728 pthread_mutex_lock(&m_lock);
9729 for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
9730 //check the buffer fd, offset, uv addr with list contents
9731 //If present increment reference.
9732 if ((out_dynamic_list[i].fd == fd) &&
9733 (out_dynamic_list[i].offset == offset)) {
9734 out_dynamic_list[i].ref_count++;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009735 DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %d ref_count = %d",
Arun Menonbdb80b02013-08-12 17:45:54 -07009736 out_dynamic_list[i].fd, out_dynamic_list[i].ref_count);
9737 buf_present = true;
9738 break;
9739 }
9740 }
9741 if (!buf_present) {
9742 for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
9743 //search for a entry to insert details of the new buffer
9744 if (out_dynamic_list[i].dup_fd == 0) {
9745 out_dynamic_list[i].fd = fd;
9746 out_dynamic_list[i].offset = offset;
9747 out_dynamic_list[i].dup_fd = dup(fd);
9748 out_dynamic_list[i].ref_count++;
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009749 DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %d ref_count = %d",
Arun Menonbdb80b02013-08-12 17:45:54 -07009750 out_dynamic_list[i].fd, out_dynamic_list[i].ref_count);
9751 break;
9752 }
9753 }
9754 }
9755 pthread_mutex_unlock(&m_lock);
9756}
9757
9758void omx_vdec::buf_ref_remove(OMX_U32 fd, OMX_U32 offset)
9759{
9760 int i = 0;
9761 pthread_mutex_lock(&m_lock);
9762 for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
9763 //check the buffer fd, offset, uv addr with list contents
9764 //If present decrement reference.
9765 if ((out_dynamic_list[i].fd == fd) &&
9766 (out_dynamic_list[i].offset == offset)) {
9767 out_dynamic_list[i].ref_count--;
9768 if (out_dynamic_list[i].ref_count == 0) {
9769 close(out_dynamic_list[i].dup_fd);
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009770 DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %d ref_count = %d",
Arun Menonbdb80b02013-08-12 17:45:54 -07009771 out_dynamic_list[i].fd, out_dynamic_list[i].ref_count);
9772 out_dynamic_list[i].dup_fd = 0;
9773 out_dynamic_list[i].fd = 0;
9774 out_dynamic_list[i].offset = 0;
9775 }
9776 break;
9777 }
9778 }
9779 if (i >= drv_ctx.op_buf.actualcount) {
Deva Ramasubramanian43918e22013-10-21 20:04:23 -07009780 DEBUG_PRINT_ERROR("Error - could not remove ref, no match with any entry in list");
Arun Menonbdb80b02013-08-12 17:45:54 -07009781 }
9782 pthread_mutex_unlock(&m_lock);
9783}
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07009784
Arun Menon1fc764f2014-04-17 15:41:27 -07009785OMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth,
9786 unsigned long nMaxFrameHeight)
9787{
9788
9789 OMX_ERRORTYPE eRet = OMX_ErrorNone;
9790 int ret = 0;
9791 unsigned long min_res_buf_count = 0;
9792
9793 eRet = enable_smoothstreaming();
9794 if (eRet != OMX_ErrorNone) {
9795 DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver");
9796 return eRet;
9797 }
9798
9799 DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu",
9800 nMaxFrameWidth,
9801 nMaxFrameHeight);
9802 m_smoothstreaming_mode = true;
9803 m_smoothstreaming_width = nMaxFrameWidth;
9804 m_smoothstreaming_height = nMaxFrameHeight;
9805
9806 //Get upper limit buffer count for min supported resolution
9807 struct v4l2_format fmt;
9808 fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
9809 fmt.fmt.pix_mp.height = m_decoder_capability.min_height;
9810 fmt.fmt.pix_mp.width = m_decoder_capability.min_width;
9811 fmt.fmt.pix_mp.pixelformat = output_capability;
9812
9813 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
9814 if (ret) {
9815 DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u",
9816 m_decoder_capability.min_height,
9817 m_decoder_capability.min_width);
9818 return OMX_ErrorUnsupportedSetting;
9819 }
9820
9821 eRet = get_buffer_req(&drv_ctx.op_buf);
9822 if (eRet != OMX_ErrorNone) {
9823 DEBUG_PRINT_ERROR("failed to get_buffer_req");
9824 return eRet;
9825 }
9826
9827 min_res_buf_count = drv_ctx.op_buf.mincount;
9828 DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u",
9829 min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width);
9830
9831 update_resolution(m_smoothstreaming_width, m_smoothstreaming_height,
9832 m_smoothstreaming_width, m_smoothstreaming_height);
9833 eRet = is_video_session_supported();
9834 if (eRet != OMX_ErrorNone) {
9835 DEBUG_PRINT_ERROR("video session is not supported");
9836 return eRet;
9837 }
9838
9839 //Get upper limit buffer size for max smooth streaming resolution set
9840 fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
9841 fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
9842 fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
9843 fmt.fmt.pix_mp.pixelformat = output_capability;
9844 ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
9845 if (ret) {
9846 DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback");
9847 return OMX_ErrorUnsupportedSetting;
9848 }
9849
9850 eRet = get_buffer_req(&drv_ctx.op_buf);
9851 if (eRet != OMX_ErrorNone) {
9852 DEBUG_PRINT_ERROR("failed to get_buffer_req!!");
9853 return eRet;
9854 }
9855 DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u",
9856 drv_ctx.op_buf.buffer_size);
9857
9858 drv_ctx.op_buf.mincount = min_res_buf_count;
9859 drv_ctx.op_buf.actualcount = min_res_buf_count;
9860 eRet = set_buffer_req(&drv_ctx.op_buf);
9861 if (eRet != OMX_ErrorNone) {
9862 DEBUG_PRINT_ERROR("failed to set_buffer_req");
9863 return eRet;
9864 }
9865
9866 eRet = get_buffer_req(&drv_ctx.op_buf);
9867 if (eRet != OMX_ErrorNone) {
9868 DEBUG_PRINT_ERROR("failed to get_buffer_req!!!");
9869 return eRet;
9870 }
9871 DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u",
9872 drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size);
9873 return eRet;
9874}
9875
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07009876#ifdef _MSM8974_
9877void omx_vdec::send_codec_config() {
9878 if (codec_config_flag) {
9879 unsigned p1 = 0; // Parameter - 1
9880 unsigned p2 = 0; // Parameter - 2
9881 unsigned ident = 0;
9882 pthread_mutex_lock(&m_lock);
9883 DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n");
9884 while (m_etb_q.m_size) {
9885 m_etb_q.pop_entry(&p1,&p2,&ident);
9886 if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
9887 if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
9888 if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
9889 (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
9890 DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
9891 omx_report_error();
9892 }
9893 } else {
9894 DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
9895 m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
9896 }
9897 } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
9898 if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
9899 if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
9900 (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
9901 DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
9902 omx_report_error ();
9903 }
9904 } else {
9905 pending_input_buffers++;
9906 DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
9907 (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
9908 empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
9909 }
9910 } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
9911 DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
9912 (OMX_BUFFERHEADERTYPE *)p1);
9913 empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
9914 }
9915 }
9916 pthread_mutex_unlock(&m_lock);
9917 }
9918}
9919#endif