1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
2826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCopyright (c) 2012, Code Aurora Forum. All rights reserved.
3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without
5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met:
6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions of source code must retain the above copyright
7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer.
8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions in binary form must reproduce the above copyright
9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer in the
10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      documentation and/or other materials provided with the distribution.
11826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Neither the name of Code Aurora nor
12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      the names of its contributors may be used to endorse or promote
13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      products derived from this software without specific prior written
14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      permission.
15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/
28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*============================================================================
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            O p e n M A X   w r a p p e r s
31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             O p e n  M A X   C o r e
32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//** @file omx_vdec.cpp
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This module contains the implementation of the OpenMAX core & component.
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//*========================================================================*/
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//                             Include Files
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <string.h>
43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <pthread.h>
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <stdlib.h>
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <unistd.h>
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <errno.h>
48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_vdec.h"
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h>
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h>
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h>
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h>
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if  defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h>
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_ICS_)
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <genlock.h>
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h"
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv";
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata";
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE        0xC5000000
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK   0xFF000000
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE       0x0F010000
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK   0xF0
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE          0
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE            1
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE         3
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN            4
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS            8
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS            12
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS            24
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE          36
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion"
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extern "C"{
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        #include<utils/Log.h>
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input)
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg;
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_msginfo vdec_msg;
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *buffer;
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_plane plane;
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pollfd pfd;
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_buffer v4l2_buf ={0};
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   struct v4l2_event dqevent;
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pfd.fd = omx->drv_ctx.video_driver_fd;
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int error_code = 0,rc=0;
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (1)
144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		rc = poll(&pfd, 1, TIMEOUT);
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (!rc) {
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("Poll timedout\n");
148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else if (rc < 0) {
150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("Error while polling: %d\n", rc);
151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.length = 1;
157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.m.planes = &plane;
158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (rc) {
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				/*TODO: How to handle this case */
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				printf("Failed to dequeue buf: %d from capture capability\n", rc);
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				break;
163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			vdec_msg.status_code=VDEC_S_SUCCESS;
166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			vdec_msg.msgdata.output_frame.len=plane.bytesused;
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane.m.userptr;
169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		else if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.m.planes = &plane;
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (rc) {
176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				/*TODO: How to handle this case */
177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				printf("Failed to dequeue buf: %d from output capability\n", rc);
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				break;
179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			vdec_msg.status_code=VDEC_S_SUCCESS;
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else if (pfd.revents & POLLPRI){
184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if(dqevent.u.data[0] == MSM_VIDC_DECODER_EVENT_CHANGE){
186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				vdec_msg.status_code=VDEC_S_SUCCESS;
188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				printf("\n VIDC Port Reconfig recieved \n");
189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			} else if (dqevent.u.data[0] == MSM_VIDC_DECODER_FLUSH_DONE){
190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				vdec_msg.status_code=VDEC_S_SUCCESS;
192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				printf("\n VIDC Flush Done Recieved \n");
193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			} else
194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				printf("\n VIDC Some Event recieved \n");
195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else if (pfd.revents & POLLERR){
196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("\n async_message_thread Exited \n");
197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else{
199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			/*TODO: How to handle this case */
200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			continue;
201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (omx->async_message_process(input,&vdec_msg) < 0) {
204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("\n async_message_thread Exited  \n");
205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				break;
206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return NULL;
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input)
213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char id;
216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int n;
217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (1)
221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    n = read(omx->m_pipe_in, &id, 1);
224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(0 == n)
226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (1 == n)
231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx->process_event_cb(omx, id);
233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ((n < 0) && (errno != EINTR))
235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id)
245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int ret_value;
247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ret_value = write(omx->m_pipe_out, &id, 1);
249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor
253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue()
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // Nothing to do
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor
259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert
265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_q[m_write].id       = id;
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_q[m_write].param1   = p1;
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_q[m_write].param2   = p2;
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_write++;
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_size ++;
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_write = 0;
278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_size > 0)
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *id = m_q[m_read].id;
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *p1 = m_q[m_read].param1;
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *p2 = m_q[m_read].param2;
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Move the read pointer ahead
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ++m_read;
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    --m_size;
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_read = 0;
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return m_q[m_read].id;
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //initialize timestamps array
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //free m_ts_arr_list?
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool duplicate_ts = false;
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //insert at the first available empty location
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_ts_arr_list[idx].valid)
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found invalid or empty entry, save timestamp
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].valid = true;
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].timestamp = ts;
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       ts, idx);
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int min_idx = -1;
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_TICKS min_ts = 0;
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_ts_arr_list[idx].valid)
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found valid entry, save index
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (min_idx < 0)
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //first valid entry
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (m_ts_arr_list[idx].timestamp < min_ts)
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (min_idx < 0)
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //no valid entries found
388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = 0;
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = m_ts_arr_list[min_idx].timestamp;
395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[min_idx].valid = false;
396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     ts, min_idx);
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[idx].valid = false;
414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances
420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void)
421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return (new omx_vdec);
423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     struct ion_handle *handle, int ionMapfd)
429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base)
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // dup file descriptor, map once, use pmem
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::omx_vdec
443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Constructor
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_app_data(NULL),
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_mem_ptr(NULL),
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_ptr(NULL),
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_phdr_pmem_ptr(NULL),
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pending_input_buffers(0),
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pending_output_buffers(0),
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_bm_count(0),
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_bm_count(0),
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_bPopulated(OMX_FALSE),
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_bPopulated(OMX_FALSE),
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_flags(0),
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_bEnabled(OMX_TRUE),
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_bEnabled(OMX_TRUE),
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_platform_list(NULL),
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_platform_entry(NULL),
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_pmem_info(NULL),
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      output_flush_progress (false),
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      input_flush_progress (false),
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      input_use_buffer (false),
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      output_use_buffer (false),
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      arbitrary_bytes (true),
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      psource_frame (NULL),
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pdest_frame (NULL),
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_heap_ptr (NULL),
478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_heap_inp_bm_count (0),
479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      codec_type_parse ((codec_type)0),
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      first_frame_meta (true),
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      frame_count (0),
482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      nal_length(0),
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      nal_count (0),
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      look_ahead_nal (false),
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      first_frame(0),
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      first_buffer(NULL),
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      first_frame_size (0),
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_error_propogated(false),
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_device_file_ptr(NULL),
490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_vc1_profile((vc1_profile_type)0),
491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      prev_ts(LLONG_MAX),
492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      rst_prev_ts(true),
493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      frm_int(0),
494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_in_alloc_cnt(0),
495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_display_id(NULL),
496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      ouput_egl_buffers(false),
497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_parser(NULL),
498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      client_extradata(0),
499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_last_au_ts(LLONG_MAX),
500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_last_au_flags(0),
501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_err_count(0),
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_heap_ptr(NULL),
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_enable_android_native_buffers(OMX_FALSE),
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_use_android_native_buffers(OMX_FALSE),
506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      in_reconfig(false),
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_use_output_pmem(OMX_FALSE),
509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_region_smi(OMX_FALSE),
510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_pvt_entry_pmem(OMX_FALSE),
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      secure_mode(false)
512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,iDivXDrmDecrypt(NULL)
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,m_desc_buffer_ptr(NULL)
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,streaming({false, false})
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Assumption is that , to begin with , we have all the frames with decoder */
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Constructor");
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char property_value[PROPERTY_VALUE_MAX] = {0};
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.perf", property_value, "0");
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  perf_flag = atoi(property_value);
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.start();
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    proc_frms = latency = 0;
529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_value[0] = NULL;
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.ts", property_value, "0");
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_timestamp = atoi(property_value);
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.set_timestamp_reorder_mode(true);
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_value[0] = NULL;
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.concealedmb", property_value, "0");
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_concealedmb = atoi(property_value);
542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&m_cmp,0,sizeof(m_cmp));
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&m_cb,0,sizeof(m_cb));
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (&drv_ctx,0,sizeof(drv_ctx));
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.timestamp_adjust = false;
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_driver_fd = -1;
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_vendor_config.pData = NULL;
559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_init(&m_lock, NULL);
560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  sem_init(&m_cmd_lock,0,0);
561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char extradata_value[PROPERTY_VALUE_MAX] = {0};
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.extradata", extradata_value, "0");
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_extradata = atoi(extradata_value);
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::~omx_vdec
574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Destructor
577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec()
585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_pmem_info = NULL;
587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Destructor");
588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_pipe_in) close(m_pipe_in);
589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_pipe_out) close(m_pipe_out);
590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_pipe_in = -1;
591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_pipe_out = -1;
592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_join(msg_thread_id,NULL);
594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_join(async_thread_id,NULL);
596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  close(drv_ctx.video_driver_fd);
597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_destroy(&m_lock);
598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  sem_destroy(&m_cmd_lock);
599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.end();
603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::OMXCntrlProcessMsgCb
610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  IL Client callbacks are generated through this routine. The decoder
613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  provides the thread context for this routine.
614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ctxt -- Context information related to the self.
617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  id   -- Event identifier. This could be any of the following:
618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          1. Command completion event
619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          2. Buffer done callback event
620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          3. Frame done callback event
621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p1; // Parameter - 1
629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p2; // Parameter - 2
630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned ident;
631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned qsize=0; // qsize
632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec *pThis = (omx_vdec *) ctxt;
633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!pThis)
635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        __func__);
638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return;
639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // Protect the shared queue data structure
642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  do
643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Read the message id's from the queue*/
645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&pThis->m_lock);
646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    qsize = pThis->m_cmd_q.m_size;
647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(qsize)
648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      qsize = pThis->m_ftb_q.m_size;
655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (qsize)
656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      qsize = pThis->m_etb_q.m_size;
664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (qsize)
665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&pThis->m_lock);
670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*process message if we have one*/
672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(qsize > 0)
673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      id = ident;
675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      switch (id)
676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EVENT:
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            switch (p1)
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_CommandStateSet:
683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = (OMX_STATETYPE) p2;
684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_state);
686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_EventCmdComplete, p1, p2, NULL);
688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_EventError:
691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(p2 == OMX_StateInvalid)
692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_state = (OMX_STATETYPE) p2;
695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                else if (p2 == OMX_ErrorHardware)
699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   pThis->omx_report_error();
701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                else
703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  {
704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_EventError, p2, NULL, NULL );
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_CommandPortDisable:
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  break;
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig)
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				  OMX_ERRORTYPE eRet = OMX_ErrorNone;
721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				  pThis->stream_off();
722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				  OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->op_buf_rcnfg);
723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				  pThis->in_reconfig = false;
724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if(eRet !=  OMX_ErrorNone)
725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pThis->omx_report_error();
728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      break;
729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_EventCmdComplete, p1, p2, NULL );
733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_CommandPortEnable:
735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_EventCmdComplete, p1, p2, NULL );
738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              default:
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_EventCmdComplete, p1, p2, NULL );
743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_ETB:
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         break;
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_FTB:
770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             pThis->omx_report_error ();
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_COMMAND:
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                    (OMX_U32)p2,(OMX_PTR)NULL);
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EBD:
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count++;
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ?true:false);
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count = 0;
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ( pThis->empty_buffer_done(&pThis->m_cmp,
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pThis->omx_report_error ();
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pThis->m_inp_err_count >= MAX_INPUT_ERROR)
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pThis->omx_report_error ();
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            int64_t *timestamp = (int64_t *)p1;
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p1)
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(*timestamp,
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ?true:false);
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free(timestamp);
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_FBD:
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (p2 != VDEC_S_SUCCESS)
831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( pThis->fill_buffer_done(&pThis->m_cmp,
836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->input_flush_progress)
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_input_flush();
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_INPUT_FLUSH_PENDING))
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_INPUT_PORT_INDEX,NULL );
870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_COMPONENT_IDLE_PENDING))
873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->output_flush_progress)
875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     if (/*ioctl (pThis->drv_ctx.video_driver_fd,
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                VDEC_IOCTL_CMD_STOP,NULL ) < 0*/0)
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     {
880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       pThis->omx_report_error ();
882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     }
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->output_flush_progress)
897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_output_flush();
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Notify Output Flush done");
917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_OUTPUT_PORT_INDEX,NULL );
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Internal flush complete");
926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (BITMASK_PRESENT(&pThis->m_flags,
929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->post_event(OMX_CommandPortDisable,
932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_CORE_OUTPUT_PORT_INDEX,
933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_COMPONENT_GENERATE_EVENT);
934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    BITMASK_CLEAR (&pThis->m_flags,
935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->input_flush_progress)
943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    if (/*ioctl (pThis->drv_ctx.video_driver_fd,
946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               VDEC_IOCTL_CMD_STOP,NULL ) < */0)
947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    {
948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pThis->omx_report_error ();
950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    }
951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_START_DONE:
963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n Move to executing");
978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StateExecuting;
981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_EventCmdComplete,OMX_CommandStateSet,
983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_StateExecuting, NULL);
984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (BITMASK_PRESENT(&pThis->m_flags,
986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_COMPONENT_PAUSE_PENDING))
987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           VDEC_IOCTL_CMD_PAUSE,NULL ) < */0)
990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->omx_report_error ();
993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
1000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_PAUSE_DONE:
1004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
1005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
1006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
1013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
1015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
1016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
1018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                //Send the callback now
1019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
1020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StatePause;
1021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_StatePause, NULL);
1024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_RESUME_DONE:
1035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
1036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
1037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
1039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
1041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
1042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
1044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
1046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
1048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
1049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
1050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StateExecuting;
1051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_StateExecuting,NULL);
1054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_STOP_DONE:
1065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
1066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
1067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
1069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
1071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
1076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
1079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StateIdle;
1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n Move to Idle State");
1083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
1084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_EventCmdComplete,OMX_CommandStateSet,
1085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_StateIdle,NULL);
1086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
1097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
1098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->start_port_reconfig() != OMX_ErrorNone)
1099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error();
1100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->in_reconfig)
1103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->m_cb.EventHandler) {
1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
1107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
1108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  format = OMX_InterlaceInterleaveFrameTopFieldFirst;
1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else //unsupported interlace format; raise a error
1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  event = OMX_EventError;
1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->m_cb.EventHandler) {
1122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    event, format, 0, NULL );
1124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
1125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EOS_DONE:
1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler) {
1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->prev_ts = LLONG_MAX;
1140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->rst_prev_ts = true;
1141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->omx_report_error ();
1146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
1148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
1150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler) {
1151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
1153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
1154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        default:
1158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&pThis->m_lock);
1162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    qsize = pThis->m_cmd_q.m_size;
1163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pThis->m_state != OMX_StatePause)
1164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
1165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&pThis->m_lock);
1166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(qsize>0);
1168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentInit
1176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Initialize the component.
1179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ctxt -- Context information related to the self.
1182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  id   -- Event identifier. This could be any of the following:
1183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          1. Command completion event
1184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          2. Buffer done callback event
1185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          3. Frame done callback event
1186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
1189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	OMX_ERRORTYPE eRet = OMX_ErrorNone;
1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_fmtdesc fdesc;
1197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_format fmt;
1198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_requestbuffers bufreq;
1199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	unsigned int   alignment = 0,buffer_size = 0;
1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int fds[2];
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int r,ret=0;
1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	bool codec_ambiguous = false;
1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	OMX_STRING device_name = "/dev/video32";
1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	drv_ctx.video_driver_fd = open("/dev/video32", O_RDWR);
1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			drv_ctx.video_driver_fd, errno);
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(drv_ctx.video_driver_fd == 0){
1211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.video_driver_fd = open(device_name, O_RDWR);
1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(drv_ctx.video_driver_fd < 0)
1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return OMX_ErrorInsufficientResources;
1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	drv_ctx.frame_rate.fps_denominator = 1;
1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	outputBufferFile1 = fopen (outputfilename, "ab");
1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	outputExtradataFile = fopen (ouputextradatafilename, "ab");
1231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// Copy the role information which provides the decoder kind
1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	strlcpy(drv_ctx.kind,role,128);
1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
1236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
1239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE);
1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.timestamp_adjust = true;
1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
1242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*Initialize Start Code for MPEG4*/
1244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_MPEG4;
1245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "m4v");
1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE);
1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingMPEG2;
1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*Initialize Start Code for MPEG2*/
1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_MPEG2;
1259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "mpg");
1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
1265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_LOW("\n H263 Decoder selected");
1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingH263;
1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_H263;
1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "263");
1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
1282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability = V4L2_PIX_FMT_DIVX_311;
1284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_DIVX;
1286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability = V4L2_PIX_FMT_DIVX;
1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_DIVX;
1298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_ambiguous = true;
1299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
1307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability = V4L2_PIX_FMT_DIVX;
1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_DIVX;
1311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_ambiguous = true;
1312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
1319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability=V4L2_PIX_FMT_H264;
1321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingAVC;
1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_H264;
1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_nal_length(nal_length);
1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "264");
1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingWMV;
1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_VC1;
1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "vc1");
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
1342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingWMV;
1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_VC1;
1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "vc1");
1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else
1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
1356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eRet = OMX_ErrorInvalidComponentName;
1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	inputBufferFile1 = fopen (inputfilename, "ab");
1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (eRet == OMX_ErrorNone)
1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		capture_capability= V4L2_PIX_FMT_NV12;
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		struct v4l2_event_subscription sub;
1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		sub.type=V4L2_EVENT_ALL;
1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Subscribe Event Failed \n");
1372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return OMX_ErrorInsufficientResources;
1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		struct v4l2_capability cap;
1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  printf("Failed to query capabilities\n");
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  /*TODO: How to handle this case */
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else {
1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  printf("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				" version = %d, capabilities = %x\n", cap.driver, cap.card,
1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				cap.bus_info, cap.version, cap.capabilities);
1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret=0;
1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
1395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.video_resolution.frame_height=drv_ctx.video_resolution.scan_lines=240;
1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.video_resolution.frame_width=drv_ctx.video_resolution.stride=320;
1404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.pixelformat = output_capability;
1408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			/*TODO: How to handle this case */
1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("Failed to set format on capture port\n");
1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Set Format was successful \n ");
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (codec_ambiguous) {
1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (output_capability == V4L2_PIX_FMT_DIVX) {
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				struct v4l2_control divx_ctrl;
1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
1419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
1420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				} else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
1421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				} else {
1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
1424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				divx_ctrl.value = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
1427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &fmt);
1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (ret) {
1429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					DEBUG_PRINT_ERROR("Failed to set divx version\n");
1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			} else {
1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				DEBUG_PRINT_ERROR("Codec should not be ambiguous");
1433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.pixelformat = output_capability;
1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			/*TODO: How to handle this case */
1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("Failed to set format on capture port\n");
1444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Set Format was successful \n ");
1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*Get the Buffer requirements for input and output ports*/
1448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
1449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
1450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.op_buf.alignment=4096;
1451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.ip_buf.alignment=4096;
1452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.extradata = 0;
1454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.picture_order = VDEC_ORDER_DECODE;
1455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.idr_only_decoding = 0;
1456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_state = OMX_StateLoaded;
1458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eRet=get_buffer_req(&drv_ctx.ip_buf);
1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (eRet == OMX_ErrorNone && !secure_mode)
1463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			eRet = enable_extradata(DEFAULT_EXTRADATA);
1464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
1466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		{
1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (m_frame_parser.mutils == NULL)
1468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				m_frame_parser.mutils = new H264_Utils();
1470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (m_frame_parser.mutils == NULL)
1472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				{
1473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
1474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					eRet = OMX_ErrorInsufficientResources;
1475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				else
1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				{
1478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
1479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
1480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.nFilledLen = 0;
1481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.nOffset = 0;
1482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					if (h264_scratch.pBuffer == NULL)
1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					{
1485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev						DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
1486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev						return OMX_ErrorInsufficientResources;
1487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					}
1488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					m_frame_parser.mutils->initialize_frame_checking_environment();
1489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
1490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			h264_parser = new h264_stream_parser();
1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (!h264_parser)
1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				eRet = OMX_ErrorInsufficientResources;
1498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if(pipe(fds))
1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		{
1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			DEBUG_PRINT_ERROR("pipe creation failed\n");
1504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			eRet = OMX_ErrorInsufficientResources;
1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		else
1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		{
1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			int temp1[2];
1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if(fds[0] == 0 || fds[1] == 0)
1510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (pipe (temp1))
1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				{
1513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					DEBUG_PRINT_ERROR("pipe creation failed\n");
1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					return OMX_ErrorInsufficientResources;
1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				//close (fds[0]);
1517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				//close (fds[1]);
1518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				fds[0] = temp1 [0];
1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				fds[1] = temp1 [1];
1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			m_pipe_in = fds[0];
1522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			m_pipe_out = fds[1];
1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			r = pthread_create(&msg_thread_id,0,message_thread,this);
1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if(r < 0)
1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				eRet = OMX_ErrorInsufficientResources;
1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (eRet != OMX_ErrorNone)
1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR("\n Component Init Failed");
1536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				NULL);
1539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
1540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		close (drv_ctx.video_driver_fd);
1541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.video_driver_fd = -1;
1542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else
1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	//memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	return eRet;
1550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetComponentVersion
1555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns the component version.
1558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  TBD.
1561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ErrorNone.
1564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_component_version
1567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     (
1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_HANDLETYPE hComp,
1569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_STRING componentName,
1570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_VERSIONTYPE* componentVersion,
1571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_VERSIONTYPE* specVersion,
1572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_UUIDTYPE* componentUUID
1573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      )
1574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
1576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
1578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* TBD -- Return the proper version */
1581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (specVersion)
1582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    specVersion->nVersion = OMX_SPEC_VERSION;
1584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SendCommand
1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns zero if all the buffers released..
1593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
1596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
1599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
1602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_COMMANDTYPE cmd,
1603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_U32 param1,
1604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_PTR cmdData
1605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      )
1606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
1608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
1609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
1611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
1617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "to invalid port: %d", param1);
1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadPortIndex;
1619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_wait(&m_cmd_lock);
1622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n send_command: Command Processed\n");
1623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SendCommand
1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns zero if all the buffers released..
1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            OMX_IN OMX_COMMANDTYPE cmd,
1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            OMX_IN OMX_U32 param1,
1643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            OMX_IN OMX_PTR cmdData
1644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            )
1645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
1647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int bFlag = 1,sem_posted = 0,ret=0;
1649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
1652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_state, eState);
1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(cmd == OMX_CommandStateSet)
1655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
1657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
1658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is Loaded */
1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateLoaded)
1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateIdle)
1664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //if all buffers are allocated or all ports disabled
1666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(allocate_done() ||
1667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Skip the event notification
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bFlag = 0;
1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Loaded */
1680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateLoaded)
1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,\
1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
1686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to WaitForResources */
1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateWaitForResources)
1689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Since error is None , we will post an event
1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           at the end of this function definition */
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
1693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Executing */
1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateExecuting)
1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
1698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Pause */
1703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StatePause)
1704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Invalid */
1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateInvalid)
1712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
1714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
1716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
1720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          eState);
1721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
1722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is IDLE */
1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateIdle)
1729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateLoaded)
1731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(release_done())
1733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /*
1735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             Since error is None , we will post an event at the end
1736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             of this function definition
1737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          */
1738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
1739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
1743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
1744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Skip the event notification
1745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bFlag = 0;
1746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to Executing */
1749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateExecuting)
1750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
1753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bFlag = 1;
1754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    m_state=OMX_StateExecuting;
1756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    printf("Stream On CAPTURE Was successful\n");
1757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to Idle */
1759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateIdle)
1760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
1762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,\
1763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
1765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to WaitForResources */
1767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateWaitForResources)
1768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
1770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Idle to Pause */
1775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StatePause)
1776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /*To pause the Video core we need to start the driver*/
1778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
1779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    NULL) < */0)
1780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
1782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           omx_report_error ();
1783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet = OMX_ErrorHardware;
1784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
1786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
1789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           bFlag = 0;
1790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to Invalid */
1793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateInvalid)
1794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
1796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
1798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
1802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
1803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /******************************/
1807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is Executing */
1808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /******************************/
1809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateExecuting)
1810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
1812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Idle */
1813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if(eState == OMX_StateIdle)
1814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /* Since error is None , we will post an event
1816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         at the end of this function definition
1817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         */
1818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
1819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         //BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
1820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(!sem_posted)
1821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           sem_posted = 1;
1823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           sem_post (&m_cmd_lock);
1824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           execute_omx_flush(OMX_ALL);
1825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         bFlag = 1;
1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 int rc=0;
1828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 enum v4l2_buf_type btype;
1829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
1831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 if (rc) {
1832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		 /*TODO: How to handle this case */
1833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		 printf("\n Failed to call streamoff on OUTPUT Port \n");
1834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 } else {
1835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		 streaming[OUTPUT_PORT] = false;
1836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 }
1837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
1839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 if (rc) {
1840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		 /*TODO: How to handle this case */
1841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		 printf("\n Failed to call streamoff on CAPTURE Port \n");
1842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 } else {
1843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		 streaming[CAPTURE_PORT] = false;
1844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 }
1845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		struct v4l2_event_subscription sub;
1846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		sub.type=V4L2_EVENT_ALL;
1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Subscribe Event Failed \n");
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eRet = OMX_ErrorHardware;
1851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 m_state == OMX_StateIdle;
1853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Paused */
1855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StatePause)
1856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("\n PAUSE Command Issued");
1858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
1859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    NULL) < */0)
1860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("\n Error In Pause State");
1862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           post_event(OMX_EventError,OMX_ErrorHardware,\
1863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      OMX_COMPONENT_GENERATE_EVENT);
1864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet = OMX_ErrorHardware;
1865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
1867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n");
1870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           bFlag = 0;
1871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Loaded */
1874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateLoaded)
1875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_GENERATE_EVENT);
1879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorIncorrectStateTransition;
1880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to WaitForResources */
1882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateWaitForResources)
1883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
1885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_GENERATE_EVENT);
1887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorIncorrectStateTransition;
1888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Executing */
1890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateExecuting)
1891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
1893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,OMX_ErrorSameState,\
1894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_GENERATE_EVENT);
1895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorSameState;
1896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Invalid */
1898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateInvalid)
1899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
1901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorInvalidState;
1903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else
1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
1907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorBadParameter;
1908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is Pause  */
1912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StatePause)
1914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to Executing */
1916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateExecuting)
1917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Pause --> Executing \n");
1919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
1920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   NULL) < */0)
1921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
1923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          post_event(OMX_EventError,OMX_ErrorHardware,\
1924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EVENT);
1925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorHardware;
1926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
1930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          post_event (NULL,VDEC_S_SUCCESS,\
1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      OMX_COMPONENT_GENERATE_RESUME_DONE);
1933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bFlag = 0;
1934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to Idle */
1937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateIdle)
1938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Since error is None , we will post an event
1940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        at the end of this function definition */
1941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Pause --> Idle \n");
1942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
1943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(!sem_posted)
1944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           sem_posted = 1;
1946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           sem_post (&m_cmd_lock);
1947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           execute_omx_flush(OMX_ALL);
1948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         bFlag = 0;
1950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to loaded */
1952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateLoaded)
1953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to WaitForResources */
1960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateWaitForResources)
1961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
1963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to Pause */
1968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StatePause)
1969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
1971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,\
1972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
1974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Pause to Invalid */
1976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateInvalid)
1977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
1979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
1981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
1985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
1986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     /***************************/
1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is WaitForResources  */
1990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateWaitForResources)
1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Loaded */
1994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateLoaded)
1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Since error is None , we will post an event
1997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        at the end of this function definition */
1998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
1999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to WaitForResources */
2001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (eState == OMX_StateWaitForResources)
2002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,
2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
2006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
2007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Executing */
2009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateExecuting)
2010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
2012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
2014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
2015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Pause */
2017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StatePause)
2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
2020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
2022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
2023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Invalid */
2025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateInvalid)
2026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
2028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
2030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Loaded -
2032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      is NOT tested by Khronos TS */
2033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
2036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
2038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorBadParameter;
2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /********************************/
2042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Current State is Invalid */
2043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*******************************/
2044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_state == OMX_StateInvalid)
2045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* State Transition from Inavlid to any state */
2047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
2048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  || OMX_StateIdle || OMX_StateExecuting
2049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  || OMX_StatePause || OMX_StateInvalid))
2050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
2052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_EventError,OMX_ErrorInvalidState,\
2053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_COMPONENT_GENERATE_EVENT);
2054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInvalidState;
2055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (cmd == OMX_CommandFlush)
2058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
2060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "with param1: %d", param1);
2061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
2064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
2068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!sem_posted){
2070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sem_posted = 1;
2071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Set the Semaphore");
2072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sem_post (&m_cmd_lock);
2073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      execute_omx_flush(param1);
2074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bFlag = 0;
2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ( cmd == OMX_CommandPortEnable)
2078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
2080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "with param1: %d", param1);
2081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_inp_bEnabled = OMX_TRUE;
2084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if( (m_state == OMX_StateLoaded &&
2086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            || allocate_input_done())
2088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
2090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EVENT);
2091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
2096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Skip the event notification
2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bFlag = 0;
2098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Enable output Port command recieved");
2103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_bEnabled = OMX_TRUE;
2104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if( (m_state == OMX_StateLoaded &&
2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              || (allocate_output_done()))
2108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
2114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
2117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              // Skip the event notification
2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFlag = 0;
2119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (cmd == OMX_CommandPortDisable)
2123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
2125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          "with param1: %d", param1);
2126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_inp_bEnabled = OMX_FALSE;
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              && release_input_done())
2131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
2138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             {
2140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if(!sem_posted)
2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               {
2142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 sem_posted = 1;
2143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 sem_post (&m_cmd_lock);
2144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
2145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
2146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
2147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             // Skip the event notification
2149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             bFlag = 0;
2150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_bEnabled = OMX_FALSE;
2155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Disable output Port command recieved");
2156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              && release_output_done())
2158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
2165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (!sem_posted)
2168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
2169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                sem_posted = 1;
2170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                sem_post (&m_cmd_lock);
2171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Skip the event notification
2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bFlag = 0;
2177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorNotImplemented;
2185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(eRet == OMX_ErrorNone && bFlag)
2187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
2189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!sem_posted)
2191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_post(&m_cmd_lock);
2193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ExecuteOmxFlush
2201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Executes the OMX flush.
2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  flushtype - input flush(1)/output flush(0)/ both.
2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  enum vdec_bufferflush flush_dir;
2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (flushType)
2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_INPUT_PORT_INDEX:
2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_INPUT;
2222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_OUTPUT_PORT_INDEX:
2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
2226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_ALL;
2231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &flush_dir;
2233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
2234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < */0)
2235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
2237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = false;
2238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush
2243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Executes the OMX flush at OUTPUT PORT.
2246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
2249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p1 = 0; // Parameter - 1
2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p2 = 0; // Parameter - 2
2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      ident = 0;
2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = true;
2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Generate FBD for all Buffers in the FTBq*/
2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
2262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Initiate Output Flush");
2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_ftb_q.m_size)
2264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       m_ftb_q.m_size,pending_output_buffers);
2267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.pop_entry(&p1,&p2,&ident);
2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_FTB )
2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_output_buffers++;
2272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
2273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (ident == OMX_COMPONENT_GENERATE_FBD)
2275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
2280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_flush_progress = false;
2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
2283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
2288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush
2292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Executes the OMX flush at INPUT PORT.
2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned       i =0;
2305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p1 = 0; // Parameter - 1
2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p2 = 0; // Parameter - 2
2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      ident = 0;
2308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = true;
2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Generate EBD for all Buffers in the ETBq*/
2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_etb_q.m_size)
2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.pop_entry(&p1,&p2,&ident);
2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(ident == OMX_COMPONENT_GENERATE_ETB)
2325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_input_buffers++;
2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
2328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
2329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
2330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (ident == OMX_COMPONENT_GENERATE_EBD)
2332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p1);
2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  time_stamp_dts.flush_timestamp();
2339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Check if Heap Buffers are to be flushed*/
2340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
2343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_scratch.nFilledLen = 0;
2344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_count = 0;
2345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
2346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_count = 0;
2347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
2348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
2349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
2350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
2351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Initialize parser");
2352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.mutils)
2353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_frame_parser.mutils->initialize_frame_checking_environment();
2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (m_input_pending_q.m_size)
2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_pending_q.pop_entry(&p1,&p2,&ident);
2360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
2361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame)
2364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
2366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = NULL;
2367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame)
2370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFilledLen = 0;
2372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
2373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame = NULL;
2374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.flush();
2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
2378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  input_flush_progress = false;
2379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes)
2380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_timestamp_list.reset_ts_list();
2388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
2391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SendCommandEvent
2398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Send the event to decoder pipe.  This is needed to generate the callbacks
2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  in decoder thread context.
2402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
2405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1,
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          unsigned int p2,
2412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          unsigned int id)
2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet      =                      false;
2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
2418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (id == OMX_COMPONENT_GENERATE_FTB ||
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      id == OMX_COMPONENT_GENERATE_FBD)
2421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.insert_entry(p1,p2,id);
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (id == OMX_COMPONENT_GENERATE_ETB ||
2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_EBD ||
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  m_etb_q.insert_entry(p1,p2,id);
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.insert_entry(p1,p2,id);
2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bRet = true;
2436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  post_message(this, id);
2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!profileLevelType)
2448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
2449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(profileLevelType->nPortIndex == 0) {
2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (profileLevelType->nProfileIndex == 1)
2460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
2462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 2)
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
2472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            profileLevelType->nProfileIndex);
2473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
2477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
2481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
2482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
2517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetParameter
2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Get Parameter method implementation
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None if successful.
2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_INDEXTYPE paramIndex,
2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_INOUT OMX_PTR     paramData)
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("get_parameter: \n");
2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
2558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(paramData == NULL)
2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(paramIndex)
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPortDefinition:
2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = update_portdef(portDefn);
2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eRet == OMX_ErrorNone)
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_port_def = *portDefn;
2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoInit:
2578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PORT_PARAM_TYPE *portParamType =
2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              (OMX_PORT_PARAM_TYPE *) paramData;
2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nSize = sizeof(portParamType);
2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nPorts           = 2;
2586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nStartPortNumber = 0;
2587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoPortFormat:
2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt->nSize             = sizeof(portFmt);
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (0 == portFmt->nPortIndex)
2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (0 == portFmt->nIndex)
2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->eCompressionFormat = eCompressionFormat;
2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              " NoMore compression formats\n");
2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet =  OMX_ErrorNoMore;
2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (1 == portFmt->nPortIndex)
2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(0 == portFmt->nIndex)
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
2618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  " NoMore Color formats\n");
2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet =  OMX_ErrorNoMore;
2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          (int)portFmt->nPortIndex);
2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Component should support this port definition*/
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamAudioInit:
2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_PORT_PARAM_TYPE *audioPortParamType =
2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                              (OMX_PORT_PARAM_TYPE *) paramData;
2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nSize = sizeof(audioPortParamType);
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nPorts           = 0;
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nStartPortNumber = 0;
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Component should support this port definition*/
2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamImageInit:
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_PORT_PARAM_TYPE *imagePortParamType =
2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                              (OMX_PORT_PARAM_TYPE *) paramData;
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nSize = sizeof(imagePortParamType);
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nPorts           = 0;
2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nStartPortNumber = 0;
2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Component should support this port definition*/
2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamOtherInit:
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          paramIndex);
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet =OMX_ErrorUnsupportedIndex;
2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamStandardComponentRole:
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_PARAM_COMPONENTROLETYPE *comp_role;
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        comp_role->nSize = sizeof(*comp_role);
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_MAX_STRINGNAME_SIZE);
2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Added for parameter test */
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPriorityMgmt:
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_PRIORITYMGMTTYPE *priorityMgmType =
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                             (OMX_PRIORITYMGMTTYPE *) paramData;
2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            priorityMgmType->nSize = sizeof(priorityMgmType);
2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Added for parameter test */
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamCompBufferSupplier:
2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bufferSupplierType->nSize = sizeof(bufferSupplierType);
2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
2702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(0 == bufferSupplierType->nPortIndex)
2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else if (1 == bufferSupplierType->nPortIndex)
2705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
2707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorBadPortIndex;
2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoAvc:
2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoH263:
2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoMpeg4:
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoMpeg2:
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              paramIndex);
2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoProfileLevelQuerySupported:
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
2741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = get_supported_profile_level_for_1080p(profileLevelType);
2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
2746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
2748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
2749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
2750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(secure_mode) {
2752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
2753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                      GRALLOC_USAGE_PRIVATE_UNCACHED);
2754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                } else {
2755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
2757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else {
2758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
2759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorBadParameter;
2760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =OMX_ErrorUnsupportedIndex;
2769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_width,
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_height,
2776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.stride,
2777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.scan_lines);
2778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((params == NULL) ||
2790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer == NULL) ||
2791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer->handle == NULL) ||
2792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      !m_enable_android_native_buffers)
2793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
2797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
2798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
2799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
2800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer = (OMX_U8*)mmap(0, handle->size,
2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
2802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(buffer == MAP_FAILED) {
2803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
2804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    return OMX_ErrorInsufficientResources;
2805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::Setparameter
2817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Set Parameter method implementation.
2820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
2823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if successful.
2826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_INDEXTYPE paramIndex,
2830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_PTR        paramData)
2831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
2834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(paramData == NULL)
2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
2843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
2844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((m_state != OMX_StateLoaded) &&
2846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
2847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_out_bEnabled == OMX_TRUE) &&
2848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
2849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_inp_bEnabled == OMX_TRUE)) {
2850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
2851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(paramIndex)
2854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPortDefinition:
2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
2858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
2859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //been called.
2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
2862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->format.video.nFrameHeight,
2863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->format.video.nFrameWidth);
2864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(OMX_DirOutput == portDefn->eDir)
2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_display_id = portDefn->format.video.pNativeWindow;
2868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
2869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size )
2870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
2872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
2873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = set_buffer_req(&drv_ctx.op_buf);
2874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (eRet == OMX_ErrorNone)
2875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  m_port_def = *portDefn;
2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
2880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
2881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                portDefn->nBufferCountActual, portDefn->nBufferSize);
2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorBadParameter;
2883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(OMX_DirInput == portDefn->eDir)
2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((portDefn->format.video.xFramerate >> 16) > 0 &&
2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Frame rate only should be set if this is a "known value" or to
2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // activate ts prediction logic (arbitrary mode only) sending input
2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // timestamps with max value (LLONG_MAX).
2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %d",
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             portDefn->format.video.xFramerate >> 16);
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          drv_ctx.frame_rate.fps_denominator);
2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!drv_ctx.frame_rate.fps_numerator)
2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = 30;
2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(drv_ctx.frame_rate.fps_denominator)
2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = (int)
2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_denominator = 1;
2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      drv_ctx.frame_rate.fps_numerator;
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            ioctl_msg.in = &drv_ctx.frame_rate;
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       (void*)&ioctl_msg) < */0)
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             frm_int, drv_ctx.frame_rate.fps_numerator /
2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (float)drv_ctx.frame_rate.fps_denominator);
2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(drv_ctx.video_resolution.frame_height !=
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameHeight ||
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.video_resolution.frame_width  !=
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameWidth)
2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameWidth,
2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameHeight);
2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if (portDefn->format.video.nFrameHeight != 0x0 &&
2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 portDefn->format.video.nFrameWidth != 0x0)
2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             {
2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.video_resolution.frame_height =
2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 drv_ctx.video_resolution.scan_lines =
2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 portDefn->format.video.nFrameHeight;
2933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.video_resolution.frame_width =
2934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 drv_ctx.video_resolution.stride =
2935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 portDefn->format.video.nFrameWidth;
2936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ioctl_msg.in = &drv_ctx.video_resolution;
2937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ioctl_msg.out = NULL;
2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (void*)&ioctl_msg) < */0)
2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               {
2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   DEBUG_PRINT_ERROR("\n Set Resolution failed");
2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = OMX_ErrorUnsupportedSetting;
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               else
2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = get_buffer_req(&drv_ctx.op_buf);
2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = set_buffer_req(&drv_ctx.ip_buf);
2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n",
2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
2959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->nBufferCountActual, portDefn->nBufferSize);
2960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorBadParameter;
2961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (portDefn->eDir ==  OMX_DirMax)
2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
2966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (int)portDefn->nPortIndex);
2967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorBadPortIndex;
2968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoPortFormat:
2972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
2974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
2975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int ret=0;
2976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      struct v4l2_format fmt;
2977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
2978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->eColorFormat);
2979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(1 == portFmt->nPortIndex)
2981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
2984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
2985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.pixelformat = capture_capability;
2986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum vdec_output_fromat op_format;
2987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
2988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  op_format = VDEC_YUV_FORMAT_NV12;
2989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(portFmt->eColorFormat ==
2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  op_format = VDEC_YUV_FORMAT_TILE_4x2;
2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   eRet = OMX_ErrorBadParameter;
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(eRet == OMX_ErrorNone)
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   drv_ctx.output_format = op_format;
2998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
2999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   if(ret)
3000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           {
3001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("\n Set output format failed");
3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorUnsupportedSetting;
3003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			/*TODO: How to handle this case */
3004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           }
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           else
3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	     {
3007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	       eRet = get_buffer_req(&drv_ctx.op_buf);
3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	     }
3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 }
3010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexPortDefn:
3015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
3017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
3018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
3019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            portFmt->nFramePackingFormat);
3020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Input port */
3022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (portFmt->nPortIndex == 0)
3023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
3025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(secure_mode) {
3027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                arbitrary_bytes = false;
3028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorUnsupportedSetting;
3030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
3031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               arbitrary_bytes = true;
3032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else if (portFmt->nFramePackingFormat ==
3035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
3036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               arbitrary_bytes = false;
3038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
3040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n",
3042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    portFmt->nFramePackingFormat);
3043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorUnsupportedSetting;
3044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
3047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
3049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
3051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
3052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_mem_region_smi = OMX_TRUE;
3054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
3057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_use_output_pmem = OMX_TRUE;
3058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     case OMX_IndexParamStandardComponentRole:
3065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
3066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_PARAM_COMPONENTROLETYPE *comp_role;
3067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
3068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
3069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       comp_role->cRole);
3070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((m_state == OMX_StateLoaded)&&
3072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
3073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("Set Parameter called in valid state");
3075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             return OMX_ErrorIncorrectStateOperation;
3080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
3087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorUnsupportedSetting;
3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
3123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
3125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorUnsupportedSetting;
3128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
3132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  )
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
3137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
3145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
3146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    )
3147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
3149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
3151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               eRet = OMX_ErrorInvalidComponentName;
3162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
3165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPriorityMgmt:
3167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_state != OMX_StateLoaded)
3169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               return OMX_ErrorIncorrectStateOperation;
3172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
3174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
3175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              priorityMgmtype->nGroupID);
3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             priorityMgmtype->nGroupPriority);
3179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
3181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
3184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamCompBufferSupplier:
3187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bufferSupplierType->eBufferSupplier);
3191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
3193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             else
3195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorBadPortIndex;
3197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
3199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoAvc:
3202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoH263:
3208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
3210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoMpeg4:
3214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
3216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoMpeg2:
3220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
3222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       case OMX_QcomIndexParamVideoDecoderPictureOrder:
3226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
3228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
3229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
3230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
3231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pictureOrder->eOutputPictureOrder);
3232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DISPLAY;
3234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
3235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DECODE;
3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  time_stamp_dts.set_timestamp_reorder_mode(false);
3237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorBadParameter;
3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
3242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.picture_order = pic_order;
3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  // ioctl_msg.in = &drv_ctx.picture_order;
3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  //ioctl_msg.out = NULL;
3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (void*)&ioctl_msg) < */0)
3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("\n Set picture order failed");
3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      eRet = OMX_ErrorUnsupportedSetting;
3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamConcealMBMapExtraData:
3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
3258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
3270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       break;
3274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamInterlaceExtraData:
3276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
3278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamH264TimeInfo:
3285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
3287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoDivx:
3294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
3296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 0
3298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         createDivxDrmContext( divXType->pDrmHandle );
3299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexPlatformPvt:
3303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
3305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
3306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
3307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
3309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_pvt_entry_pmem = OMX_TRUE;
3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
3317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_use_output_pmem = OMX_TRUE;
3318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
3326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
3327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.idr_only_decoding = 1;
3328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          int rc; //= ioctl(drv_ctx.video_driver_fd,
3329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               //       VDEC_IOCTL_SET_IDR_ONLY_DECODING);
3330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(rc < 0) {
3331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
3332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorHardware;
3333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamIndexExtraDataType:
3338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
3340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
3341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
3342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->bEnabled == OMX_TRUE) &&
3343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->nPortIndex == 1))
3344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
3346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
3347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              // Set smooth streaming parameter
3348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              int rc;// = ioctl(drv_ctx.video_driver_fd,
3349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   //         VDEC_IOCTL_SET_CONT_ON_RECONFIG);
3350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(rc < 0) {
3351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorHardware;
3353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
3357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Need to allow following two set_parameters even in Idle
3361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * state. This is ANDROID architecture which is not in sync
3362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * with openmax standard. */
3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(enableNativeBuffers) {
3367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_enable_android_native_buffers = enableNativeBuffers->enable;
3368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = use_android_native_buffer(hComp, paramData);
3374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamEnableTimeStampReorder:
3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
3380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) {
3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE) {
3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              frm_int =0;
3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              time_stamp_dts.set_timestamp_reorder_mode(true);
3384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            time_stamp_dts.set_timestamp_reorder_mode(false);
3387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
3388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          time_stamp_dts.set_timestamp_reorder_mode(false);
3389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE)
3390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
3397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
3399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorUnsupportedIndex;
3400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
3403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetConfig
3408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Get Config Method implementation.
3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if successful.
3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_IN OMX_INDEXTYPE configIndex,
3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_INOUT OMX_PTR     configData)
3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_state == OMX_StateInvalid)
3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorInvalidState;
3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (configIndex)
3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexConfigInterlaced:
3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (configFmt->nPortIndex == 1)
3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (configFmt->nIndex == 0)
3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (configFmt->nIndex == 1)
3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          configFmt->eInterlaceType =
3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (configFmt->nIndex == 2)
3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          configFmt->eInterlaceType =
3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            " NoMore Interlaced formats\n");
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorNoMore;
3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (int)configFmt->nPortIndex);
3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //(void)(ioctl(drv_ctx.video_driver_fd,
3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               //VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	decoderinstances->nNumOfInstances = 16;
3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	/*TODO: How to handle this case */
3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_QcomIndexConfigVideoFramePackingArrangement:
3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_pack_data(configFmt);
3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorBadParameter;
3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SetConfig
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Set Config method implementation
3513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if successful.
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_IN OMX_INDEXTYPE configIndex,
3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_IN OMX_PTR        configData)
3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInvalidState;
3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_VIDEO_CONFIG_NALSIZE *pNal;
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Set Config Called");
3534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_state == OMX_StateExecuting)
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return ret;
3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (configIndex == OMX_IndexVendorVideoExtraData)
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 extra_size;
3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Parsing done here for the AVC atom is definitely not generic
3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Currently this piece of code is working, but certainly
3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // not tested with all .mp4 files.
3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Incase of failure, we might need to revisit this
3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // for a generic piece of code.
3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Retrieve size of NAL length field
3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // byte #4 contains the size of NAL lenght field
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nal_length = (config->pData[4] & 0x03) + 1;
3558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_size = 0;
3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (nal_length > 2)
3561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        extra_size = (nal_length - 2) * 2;
3564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // SPS starts from byte #6
3567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
3568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U8 *pDestBuf;
3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nPortIndex = config->nPortIndex;
3570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // minus 6 --> SPS starts from byte #6
3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // minus 1 --> picture param set byte to be ignored from avcatom
3573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
3574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
3575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 len;
3576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U8 index = 0;
3577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // case where SPS+PPS is sent as part of set_config
3578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pDestBuf = m_vendor_config.pData;
3579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
3581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_vendor_config.nPortIndex,
3582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_vendor_config.nDataSize,
3583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_vendor_config.pData);
3584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      while (index < 2)
3585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        uint8 *psize;
3587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len = *pSrcBuf;
3588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len = len << 8;
3589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len |= *(pSrcBuf + 1);
3590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psize = (uint8 *) & len;
3591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
3592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (int i = 0; i < nal_length; i++)
3593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pDestBuf[i] = psize[nal_length - 1 - i];
3595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //memcpy(pDestBuf,pSrcBuf,(len+2));
3597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pDestBuf += len + nal_length;
3598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pSrcBuf += len + 2;
3599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index++;
3600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pSrcBuf++;   // skip picture param set
3601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len = 0;
3602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
3605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
3606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nPortIndex = config->nPortIndex;
3608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nDataSize = config->nDataSize;
3609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
3610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
3611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
3613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_vendor_config.pData)
3615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free(m_vendor_config.pData);
3617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData = NULL;
3618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = 0;
3619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (((*((OMX_U32 *) config->pData)) &
3622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             VC1_SP_MP_START_CODE_MASK) ==
3623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             VC1_SP_MP_START_CODE)
3624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
3626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
3628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData =
3629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_U8 *) malloc(config->nDataSize);
3630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy(m_vendor_config.pData, config->pData,
3631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   config->nDataSize);
3632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vc1_profile = VC1_SP_MP_RCV;
3633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
3635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
3637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
3639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData =
3640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_U8 *) malloc((config->nDataSize));
3641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy(m_vendor_config.pData, config->pData,
3642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   config->nDataSize);
3643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vc1_profile = VC1_AP;
3644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
3646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
3648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize  = config->nDataSize;
3650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
3651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
3652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vc1_profile = VC1_SP_MP_RCV;
3653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
3657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return ret;
3660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (configIndex == OMX_IndexConfigVideoNalSize)
3662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
3665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_length = pNal->nNaluBytes;
3666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_nal_length(nal_length);
3667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
3668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return ret;
3669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
3672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetExtensionIndex
3677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX GetExtensionIndex method implementaion.  <TBD>
3680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
3686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
3689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_IN OMX_STRING      paramName,
3690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_OUT OMX_INDEXTYPE* indexType)
3691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
3693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
3695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
3696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
3699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
3701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
3707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
3710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
3712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
3713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
3714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
3721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetState
3729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns the state information back to the caller.<TBD>
3732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None if everything is successful.
3738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
3740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_OUT OMX_STATETYPE* state)
3741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  *state = m_state;
3743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
3744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
3745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentTunnelRequest
3750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Component Tunnel Request method implementation. <TBD>
3753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
3756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
3759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
3762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_IN OMX_U32                        port,
3763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
3764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_IN OMX_U32                    peerPort,
3765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
3769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseOutputBuffer
3774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Helper function for Use buffer in the input pin
3777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
3780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
3786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
3787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
3788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
3789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
3790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes,
3791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U8*                   buffer)
3792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
3795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned                         i= 0; // Temporary counter
3796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
3798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PTR privateAppData = NULL;
3799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  private_handle_t *handle = NULL;
3800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buff = buffer;
3801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr) {
3802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
3803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_output_headers();
3804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
3807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
3808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_out_bm_count,i))
3809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
3811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i >= drv_ctx.op_buf.actualcount) {
3816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
3817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
3820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
3821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
3822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_use_android_native_buffers) {
3823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
3824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           sp<android_native_buffer_t> nBuf = params->nativeBuffer;
3825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           handle = (private_handle_t *)nBuf->handle;
3826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           privateAppData = params->pAppPrivate;
3827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
3829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           handle = (private_handle_t *)buff;
3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           if(!secure_mode) {
3831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	       buff =  (OMX_U8*)mmap(0, handle->size,
3832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
3833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if (buff == MAP_FAILED) {
3834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   return OMX_ErrorInsufficientResources;
3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
3837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    }
3838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           privateAppData = appData;
3839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_ICS_)
3841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        native_buffer[i].nativehandle = handle;
3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!handle) {
3844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
3848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
3849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
3850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
3851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
3852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else
3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!ouput_egl_buffers && !m_use_output_pmem) {
3856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
3857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].fd_ion_data, 0);
3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
3862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
3863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
3865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
3866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
3868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          open (MEM_DEVICE,O_RDWR);
3869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
3871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
3872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            open (MEM_DEVICE,O_RDWR);
3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
3880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size,
3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.alignment))
3886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
3893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].bufferaddr =
3894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              PROT_READ|PROT_WRITE, MAP_SHARED,
3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
3898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
3900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
3901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return OMX_ErrorInsufficientResources;
3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
3906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
3907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
3908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
3909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
3911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!appData || !bytes ) {
3912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!secure_mode && !buffer) {
3913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
3914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return OMX_ErrorBadParameter;
3915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
3919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
3921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
3922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            !pmem_list->nEntries ||
3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
3924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
3925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
3928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pmem_list->entryList->entry;
3929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
3930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          pmem_info->pmem_fd);
3931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
3932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
3933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
3934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
3936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
3937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
3938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
3939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
3940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     *bufferHdr = (m_out_mem_ptr + i );
3942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(secure_mode)
3943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
3944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
3945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
3946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             sizeof (vdec_bufferpayload));
3947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //     ioctl_msg.in  = &setbuffers;
3949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //     ioctl_msg.out = NULL;
3950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
3952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
3953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     // if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
3954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //      &ioctl_msg) < 0)
3955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //  {
3956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //  DEBUG_PRINT_ERROR("\n Set output buffer failed");
3957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //   return OMX_ErrorInsufficientResources;
3958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //  }
3959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     // found an empty buffer at i
3960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
3961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->pBuffer = buff;
3962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->pAppPrivate = privateAppData;
3963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     BITMASK_SET(&m_out_bm_count,i);
3964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
3966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::use_input_heap_buffers
3971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use Buffer Heap allocation method implementation.
3974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None , if everything successful.
3980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
3983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
3984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
3985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
3986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
3987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes,
3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U8*                   buffer)
3989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
3991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr)
3993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
3994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
3995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_phdr_pmem_ptr)
3997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
3998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
3999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficent memory");
4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
4006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = true;
4008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
4009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
4010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
4011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
4012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
4013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
4014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL))
4018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_in_alloc_cnt++;
4023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
4027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseBuffer
4035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use Buffer method implementation.
4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
4041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None , if everything successful.
4044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_buffer(
4047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
4050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes,
4052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U8*                   buffer)
4053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE error = OMX_ErrorNone;
4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || bytes == 0)
4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode && buffer == NULL) {
4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
4062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
4066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInvalidState;
4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == OMX_CORE_INPUT_PORT_INDEX)
4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
4072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
4077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = OMX_ErrorBadPortIndex;
4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(error == OMX_ErrorNone)
4081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
4083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Send the callback now
4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandStateSet,OMX_StateIdle,
4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_EVENT);
4088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_CORE_INPUT_PORT_INDEX,
4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_COMPONENT_GENERATE_EVENT);
4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
4098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_CORE_OUTPUT_PORT_INDEX,
4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_COMPONENT_GENERATE_EVENT);
4104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return error;
4107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_heap_ptr[bufferindex].pBuffer)
4115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free(m_inp_heap_ptr[bufferindex].pBuffer);
4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
4117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (pmem_bufferHdr)
4119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer(pmem_bufferHdr);
4120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int index = 0;
4126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
4127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  index = bufferHdr - m_inp_mem_ptr;
4132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
4135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
4138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       struct vdec_setbuffer_cmd setbuffers;
4141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
4143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sizeof (vdec_bufferpayload));
4144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.in  = &setbuffers;
4145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.out = NULL;
4146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       int ioctl_r; //= ioctl (drv_ctx.video_driver_fd,
4147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           //                 VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
4148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (ioctl_r < 0)
4149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
4151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
4154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].pmem_fd);
4155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
4156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].mmaped_size,
4157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].bufferaddr);
4158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ptr_inputbuffer[index].mmaped_size);
4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_desc_buffer_ptr[index].buf_addr);
4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].buf_addr = NULL;
4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].desc_data_size = 0;
4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int index = 0;
4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  index = bufferHdr - m_out_mem_ptr;
4187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
4188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.op_buf.actualcount
4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && drv_ctx.ptr_outputbuffer)
4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
4193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
4194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_setbuffer_cmd setbuffers;
4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
4199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        sizeof (vdec_bufferpayload));
4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
4201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
4202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\nRelease the Output Buffer");
4203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
4204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          &ioctl_msg) < */0)
4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
4206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
4209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
4210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
4211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[index].mmaped_size);
4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
4217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[0].pmem_fd);
4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
4221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[0].mmaped_size,
4222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[0].bufferaddr);
4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
4224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[0].mmaped_size);
4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
4241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_BUFFERHEADERTYPE **bufferHdr,
4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_U32              port,
4243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_PTR              appData,
4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_U32              bytes)
4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *input = NULL;
4247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char *buf_addr = NULL;
4248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned   i = 0;
4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Sanity Check*/
4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL)
4253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_heap_ptr == NULL)
4258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
4260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
4263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_heap_ptr == NULL)
4267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
4269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Find a Free index*/
4274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.ip_buf.actualcount)
4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buf_addr == NULL)
4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_inp_heap_ptr + i);
4293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input = *bufferHdr;
4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    BITMASK_SET(&m_heap_inp_bm_count,i);
4295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pBuffer           = (OMX_U8 *)buf_addr;
4297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nVersion.nVersion = OMX_SPEC_VERSION;
4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pAppPrivate       = appData;
4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
4303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] );
4305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Add the Buffers to freeq*/
4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL))
4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateInputBuffer
4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Helper function for allocate buffer in the input pin
4328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
4334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
4337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
4338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
4340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
4341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes)
4342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *input = NULL;
4347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned   i = 0;
4349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char *buf_addr = NULL;
4350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int pmem_fd = -1;
4351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bytes != drv_ctx.ip_buf.buffer_size)
4353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
4355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes, drv_ctx.ip_buf.buffer_size);
4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_mem_ptr)
4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
4362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.actualcount,
4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.buffer_size);
4364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_mem_ptr == NULL)
4369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
4374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer == NULL)
4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
4382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info == NULL)
4385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
4391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(BITMASK_ABSENT(&m_inp_bm_count,i))
4402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
4405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i < drv_ctx.ip_buf.actualcount)
4409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct v4l2_buffer buf;
4411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct v4l2_plane plane;
4412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int rc;
4413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate input Buffer");
4414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
4417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
4418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		    &drv_ctx.ip_buf_ion_info[i].fd_ion_data, 0);
4419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
4420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd < 0)
4427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd == 0)
4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
4435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pmem_fd < 0)
4437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
4444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.alignment))
4445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(pmem_fd);
4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
4452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buf_addr = (unsigned char *)mmap(NULL,
4453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ip_buf.buffer_size,
4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buf_addr == MAP_FAILED)
4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            close(pmem_fd);
4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_inp_mem_ptr + i);
4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
4471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
4473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].offset = 0;
4475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.index = i;
4478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
4479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.memory = V4L2_MEMORY_USERPTR;
4480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.bytesused = 0;
4481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
4483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.reserved[1] = 0;
4485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
4486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.m.planes = &plane;
4487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.length = 1;
4488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
4490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
4492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (rc) {
4494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       printf("Failed to prepare bufs\n");
4495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   /*TODO: How to handle this case */
4496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorInsufficientResources;
4497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input = *bufferHdr;
4500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    BITMASK_SET(&m_inp_bm_count,i);
4501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
4502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer           = (OMX_U8 *)buf_addr;
4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nVersion.nVersion = OMX_SPEC_VERSION;
4508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pAppPrivate       = appData;
4510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
4512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.disable_dmx)
4514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = allocate_desc_buffer(i);
4516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
4521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateOutputBuffer
4530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Helper fn for AllocateBuffer in the output pin
4533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
4536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything went well.
4539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
4542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
4543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
4545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
4546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes)
4547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
4550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned                         i= 0; // Temporary counter
4551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_device_fd =-1;
4555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_allocation_data ion_alloc_data;
4556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_fd_data fd_ion_data;
4557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_out_mem_ptr)
4559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
4561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount,
4562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size);
4563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nBufHdrSize        = 0;
4564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformEntrySize = 0;
4565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformListSize  = 0;
4566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPMEMInfoSize = 0;
4567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int pmem_fd = -1;
4568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned char *pmem_baseaddress = NULL;
4569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
4571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
4572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
4573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
4575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
4577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
4580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
4581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
4582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
4583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
4584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
4585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
4587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE),
4588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPMEMInfoSize,
4589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPlatformListSize);
4590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
4591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         drv_ctx.op_buf.actualcount);
4592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_device_fd = alloc_map_ion_memory(
4594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.op_buf.alignment,
4596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &ion_alloc_data, &fd_ion_data, 0);
4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ion_device_fd < 0) {
4598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = fd_ion_data.fd;
4601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd < 0)
4605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
4607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf.buffer_size);
4608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(pmem_fd == 0)
4612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
4614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pmem_fd < 0)
4616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
4618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size);
4619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
4624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount,
4625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.alignment))
4626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(pmem_fd);
4629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!secure_mode) {
4633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_baseaddress = (unsigned char *)mmap(NULL,
4634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           (drv_ctx.op_buf.buffer_size *
4635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.op_buf.actualcount),
4636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
4637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pmem_baseaddress == MAP_FAILED)
4638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
4640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size);
4641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(pmem_fd);
4642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
4649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Alloc mem for platform specific info
4650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *pPtr=NULL;
4651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
4652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     nPMEMInfoSize,1);
4653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
4654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
4655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
4657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
4658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
4661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),
4662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
4666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer)
4667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_outputbuffer[0].mmaped_size =
4669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (drv_ctx.op_buf.buffer_size *
4670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         drv_ctx.op_buf.actualcount);
4671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufHdr          =  m_out_mem_ptr;
4672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
4674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_list)  + nPlatformListSize);
4675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_entry) + nPlatformEntrySize);
4677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList   = m_platform_list;
4678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry  = m_platform_entry;
4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo       = m_pmem_info;
4680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Settting the entire storage nicely
4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
4689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
4690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Set the values when we determine the right HxW param
4691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = bytes;
4692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nFilledLen         = 0;
4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = appData;
4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Platform specific PMEM Information
4696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform Entry
4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
4698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->entry      = pPMEMInfo;
4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform List
4701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->nEntries    = 1;
4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->entryList   = pPlatformEntry;
4703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep pBuffer NULL till vdec is opened
4704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pBuffer            = NULL;
4705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOffset            = 0;
4706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->pmem_fd = 0;
4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pPlatformPrivate = pPlatformList;
4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
4712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Create a mapping between buffers*/
4719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
4722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr =
4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
4725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
4727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
4728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].bufferaddr);
4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Move the buffer and buffer header pointers
4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr++;
4731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo++;
4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry++;
4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList++;
4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        m_out_mem_ptr, pPtr);
4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_out_mem_ptr)
4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_out_mem_ptr);
4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_out_mem_ptr = NULL;
4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPtr)
4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPtr);
4748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPtr = NULL;
4749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
4751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
4753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
4762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
4763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =  OMX_ErrorInsufficientResources;
4768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.op_buf.actualcount; i++)
4772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(BITMASK_ABSENT(&m_out_bm_count,i))
4774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
4776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
4777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone)
4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(i < drv_ctx.op_buf.actualcount)
4783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      struct v4l2_buffer buf;
4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      struct v4l2_plane plane;
4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int rc;
4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_outputbuffer[i].buffer_len =
4790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf.buffer_size;
4791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_out_mem_ptr + i );
4793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode) {
4794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
4795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
4797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.index = i;
4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.memory = V4L2_MEMORY_USERPTR;
4801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.length = drv_ctx.op_buf.buffer_size;
4802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[i].bufferaddr-drv_ctx.ptr_outputbuffer[i].offset);
4803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
4805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.data_offset = 0;
4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.m.planes = &plane;
4809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.length = 1;
4810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
4812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
4813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (rc) {
4814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*TODO: How to handle this case */
4815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorInsufficientResources;
4816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
4819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		enum v4l2_buf_type buf_type;
4820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
4821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
4822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (rc) {
4823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			return OMX_ErrorInsufficientResources;
4824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else {
4825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			streaming[CAPTURE_PORT] = true;
4826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  }
4829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
4831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (*bufferHdr)->pAppPrivate = appData;
4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_SET(&m_out_bm_count,i);
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInsufficientResources;
4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer  -- API Call
4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateBuffer
4849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns zero if all the buffers released..
4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
4855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_IN OMX_U32                        port,
4863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_IN OMX_PTR                     appData,
4864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_IN OMX_U32                       bytes)
4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned i = 0;
4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
4870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX)
4877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (arbitrary_bytes)
4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
4881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
4883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
4885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
4890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
4894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorBadPortIndex;
4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eRet == OMX_ErrorNone)
4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(allocate_done()){
4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandStateSet,OMX_StateIdle,
4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_GENERATE_EVENT);
4906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
4909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
4911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
4912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortEnable,
4914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_CORE_INPUT_PORT_INDEX,
4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
4919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortEnable,
4924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_CORE_OUTPUT_PORT_INDEX,
4925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_COMPONENT_GENERATE_EVENT);
4926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
4930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call
4934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::FreeBuffer
4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
4945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
4948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_U32                 port,
4949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
4952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int nPortIndex;
4953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("In for decoder free_buffer \n");
4954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateIdle &&
4956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
4957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
4959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
4961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
4962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
4964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
4966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
4968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
4969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_ErrorPortUnpopulated,
4970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
4971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
4973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (m_state != OMX_StateInvalid)
4975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
4978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_ErrorPortUnpopulated,
4979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
4980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX)
4983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /*Check if arbitrary bytes*/
4985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!arbitrary_bytes && !input_use_buffer)
4986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - m_inp_mem_ptr;
4987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
4988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - m_inp_heap_ptr;
4989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
4991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.ip_buf.actualcount)
4992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // Clear the bit associated with it.
4994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
4995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (input_use_buffer == true)
4997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
5000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_phdr_pmem_ptr)
5001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
5002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
5004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
5005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (arbitrary_bytes)
5006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
5007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(m_phdr_pmem_ptr)
5008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
5009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
5010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,NULL);
5011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
5012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
5013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_input_buffer(buffer);
5014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_inp_bPopulated = OMX_FALSE;
5016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /*Free the Buffer Header*/
5017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (release_input_done())
5018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
5019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer_header();
5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
5022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
5024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
5026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
5027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
5030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           && release_input_done())
5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
5034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandPortDisable,
5035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_CORE_INPUT_PORT_INDEX,
5036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EVENT);
5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // check if the buffer is valid
5042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr;
5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.op_buf.actualcount)
5044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
5046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Clear the bit associated with it.
5047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_bPopulated = OMX_FALSE;
5049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_output_buffer (buffer);
5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (release_output_done())
5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_output_buffer_header();
5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
5055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
5057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
5059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
5060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
5062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           && release_output_done())
5063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
5065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (m_enable_android_native_buffers)
5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
5072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
5074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortDisable,
5077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_CORE_OUTPUT_PORT_INDEX,
5078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_COMPONENT_GENERATE_EVENT);
5079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
5084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((eRet == OMX_ErrorNone) &&
5086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(release_done())
5089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Send the callback now
5091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
5092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandStateSet, OMX_StateLoaded,
5093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_COMPONENT_GENERATE_EVENT);
5094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
5097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::EmptyThisBuffer
5103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This routine is used to push the encoded video frames to
5106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  the video decoder.
5107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything went successful.
5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
5120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
5124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInvalidState;
5125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer == NULL)
5128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_inp_bEnabled)
5134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
5136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
5140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex);
5142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(iDivXDrmDecrypt)
5147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
5149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drmErr != OMX_ErrorNone) {
5150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // this error can be ignored
5151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
5152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
5156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!latency)
5158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.stop();
5160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      latency = dec_time.processing_time_us();
5161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.start();
5162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
5166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufferIndex = buffer - m_inp_heap_ptr;
5168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (input_use_buffer == true)
5172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
5173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_heap_ptr;
5174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
5175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
5176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
5177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       buffer = &m_inp_mem_ptr[nBufferIndex];
5178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
5179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
5180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else{
5182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_mem_ptr;
5183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
5187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
5189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
5193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
5194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
5195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned)hComp,(unsigned)buffer,
5197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
5198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
5202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(buffer->nTimeStamp);
5203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
5204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::empty_this_buffer_proxy
5211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This routine is used to push the encoded video frames to
5214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  the video decoder.
5215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything went successful.
5221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
5224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int push_cnt = 0,i=0;
5227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned nPortIndex = 0;
5228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
5229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_input_frameinfo frameinfo;
5230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_bufferpayload *temp_buffer;
5231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg;
5232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_seqheader seq_header;
5233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool port_setting_changed = true;
5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool not_coded_vop = false;
5235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Should we generate a Aync error event*/
5237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
5238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
5240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
5244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nPortIndex > drv_ctx.ip_buf.actualcount)
5246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
5248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex);
5249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_input_buffers++;
5253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
5256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
5257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer");
5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
5261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
5262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4StreamType psBits;
5267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
5268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.numBytes = buffer->nFilledLen;
5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4_headerparser.parseHeader(&psBits);
5270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    not_coded_vop = mp4_headerparser.is_notcodec_vop(
5271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(not_coded_vop) {
5273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\n Found Not coded vop len %d frame number %d",
5274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             buffer->nFilledLen,frame_count);
5275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
5276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
5277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          not_coded_vop = false;
5278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          buffer->nFilledLen = 0;
5279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(input_flush_progress == true
5284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     || not_coded_vop
5286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     )
5288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
5290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
5292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
5293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
5296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
5298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
5303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*for use buffer we need to memcpy the data*/
5304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  temp_buffer->buffer_len = buffer->nFilledLen;
5305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (input_use_buffer)
5307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFilledLen <= temp_buffer->buffer_len)
5309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(arbitrary_bytes)
5311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
5315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
5317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->nFilledLen);
5318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
5323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.bufferaddr = temp_buffer->bufferaddr;
5328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.client_data = (void *) buffer;
5329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.datalen = temp_buffer->buffer_len;
5330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.flags = 0;
5331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.offset = buffer->nOffset;
5332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.pmem_fd = temp_buffer->pmem_fd;
5333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.pmem_offset = temp_buffer->offset;
5334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.timestamp = buffer->nTimeStamp;
5335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
5336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: dmx enabled");
5338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_demux_entries == 0)
5339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extract_demux_addr_offsets(buffer);
5341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
5344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    handle_demux_data(buffer);
5345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
5346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
5347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = NULL;
5351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = 0;
5352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!arbitrary_bytes)
5354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frameinfo.flags |= buffer->nFlags;
5356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(arbitrary_bytes)
5362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (inputBufferFile1)
5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite((const char *)temp_buffer->bufferaddr,
5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      temp_buffer->buffer_len,1,inputBufferFile1);
5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
5389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_scratch.nFilledLen = 0;
5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_count = 0;
5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_count = 0;
5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.mutils)
5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_frame_parser.mutils->initialize_frame_checking_environment();
5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.flush();
5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct v4l2_buffer buf = {0};
5405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_plane plane;
5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
5407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	unsigned long  print_count;
5408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {  buf.flags = V4L2_BUF_FLAG_EOS;
5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  printf("\n  INPUT EOS reached \n") ;
5411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	OMX_ERRORTYPE eRet = OMX_ErrorNone;
5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.index = nPortIndex;
5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.memory = V4L2_MEMORY_USERPTR;
5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.bytesused = temp_buffer->buffer_len;
5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.length = drv_ctx.ip_buf.buffer_size;
5418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.m.userptr = (unsigned long)(temp_buffer->bufferaddr-temp_buffer->offset);
5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.reserved[0] = temp_buffer->pmem_fd;
5420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.reserved[1] = temp_buffer->offset;
5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.data_offset = 0;
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.m.planes = &plane;
5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.length = 1;
5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!streaming[OUTPUT_PORT])
5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum v4l2_buf_type buf_type;
5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int ret,r;
5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(!ret) {
5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Streamon on OUTPUT Plane was successful \n");
5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		streaming[OUTPUT_PORT] = true;
5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = pthread_create(&async_thread_id,0,async_message_thread,this);
5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if(ret < 0)
5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("\n Failed to create async_message_thread \n");
5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	} else{
5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*TODO: How to handle this case */
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf(" \n Failed to call streamon on OUTPUT \n");
5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      time_stamp_dts.insert_timestamp(buffer);
5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::FillThisBuffer
5453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  IL client uses this method to release the frame buffer
5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  after displaying them.
5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
5472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInvalidState;
5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_bEnabled)
5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer == NULL || ((buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount))
5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  post_event((unsigned) hComp, (unsigned)buffer,OMX_COMPONENT_GENERATE_FTB);
5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::fill_this_buffer_proxy
5499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  IL client uses this method to release the frame buffer
5502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  after displaying them.
5503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
5509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE        hComp,
5513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE nRet = OMX_ErrorNone;
5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
5517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
5518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned nPortIndex = 0;
5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_fillbuffer_cmd fillbuffer;
5520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_out_mem_ptr);
5524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferAdd == NULL || ((buffer - m_out_mem_ptr) >
5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount) )
5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufferAdd, bufferAdd->pBuffer);
5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Return back the output buffer to client*/
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_output_buffers++;
5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ptr_respbuffer)
5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
5544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
5549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer->nFilledLen = 0;
5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.FillBufferDone (hComp,m_app_data,buffer);
5551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_output_buffers--;
5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
5556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sizeof(struct vdec_bufferpayload));
5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // fillbuffer.client_data = bufferAdd;
5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Acquire a write lock on this buffer.
5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle,
5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                  GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Failed to acquire genlock");
5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen = 0;
5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_cb.FillBufferDone (hComp,m_app_data,buffer);
5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pending_output_buffers--;
5569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
5571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[buffer - m_out_mem_ptr].inuse = true;
5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc = 0;
5576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_buffer buf={0};
5577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_plane plane;
5578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.index = nPortIndex;
5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
5581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.memory = V4L2_MEMORY_USERPTR;
5582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.bytesused = buffer->nFilledLen;
5583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.length = drv_ctx.op_buf.buffer_size;
5584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr-drv_ctx.ptr_outputbuffer[nPortIndex].offset);
5585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
5586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
5587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.data_offset = 0;
5588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.m.planes = &plane;
5589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.length = 1;
5590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
5592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
5593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*TODO: How to handle this case */
5594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to qbuf to driver");
5595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#ifdef _ANDROID_ICS_
5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //  if (m_enable_android_native_buffers)
5598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //  {
5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Unlock the buffer
5600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   //     if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
5601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //        DEBUG_PRINT_ERROR("Releasing genlock failed");
5602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //        return OMX_ErrorInsufficientResources;
5603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ///    } else {
5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //       native_buffer[buffer - m_out_mem_ptr].inuse = false;
5605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //  }
5606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // }
5607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#endif
5608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //m_cb.FillBufferDone (hComp,m_app_data,buffer);
5609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // pending_output_buffers--;
5610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // return OMX_ErrorBadParameter;
5611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //}
5612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SetCallbacks
5618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Set the callbacks.
5621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
5627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
5630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
5631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_PTR             appData)
5632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_cb       = *callbacks;
5635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
5636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               m_cb.EventHandler,m_cb.FillBufferDone);
5637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_app_data =    appData;
5638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
5639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentDeInit
5644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Destroys the component and release memory allocated to the heap.
5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
5653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(iDivXDrmDecrypt)
5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int i = 0;
5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (OMX_StateLoaded != m_state)
5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          m_state);
5670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
5671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the output buffers have to be cleaned up*/
5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr)
5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Freeing the Output Memory\n");
5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i < drv_ctx.op_buf.actualcount; i++ )
5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free_output_buffer (&m_out_mem_ptr[i]);
5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_enable_android_native_buffers)
5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (native_buffer[i].inuse)
5688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
5689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("Unlocking genlock failed");
5691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
5692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[i].inuse = false;
5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
5694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the input buffers have to be cleaned up*/
5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_mem_ptr || m_inp_heap_ptr)
5704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Freeing the Input Memory\n");
5706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i<drv_ctx.ip_buf.actualcount; i++ )
5707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_inp_mem_ptr)
5709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,&m_inp_mem_ptr[i]);
5710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
5711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,NULL);
5712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(h264_scratch.pBuffer)
5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	h264_parser = NULL;
5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_platform_list)
5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_platform_list);
5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_platform_list = NULL;
5732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_vendor_config.pData)
5734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_vendor_config.pData);
5736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_vendor_config.pData = NULL;
5737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Reset counters in mesg queues
5740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_size=0;
5741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_size=0;
5742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_size=0;
5743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_read = m_ftb_q.m_write =0;
5744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_read = m_cmd_q.m_write =0;
5745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_read = m_etb_q.m_write =0;
5746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_debug_timestamp)
5748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.reset_ts_list();
5750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
5754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
5755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       // NULL);
5756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Close the driver instance");
5757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
5762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputBufferFile1);
5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
5765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
5768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseEGLImage
5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use EGL Image method implementation <TBD>.
5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
5780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Not Implemented error.
5783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
5787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN OMX_U32                        port,
5788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN OMX_PTR                     appData,
5789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN void*                      eglImage)
5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
5797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   EGLint fd = -1, offset = 0,pmemPtr = 0;
5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int fd = -1, offset = 0;
5800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
5803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("\n ");
5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_display_id == NULL) {
5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    eglGetProcAddress("eglQueryImageKHR");
5812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
5813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
5814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
5815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
5816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
5817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
5818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
5819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (temp_egl_id != NULL)
5824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
5827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.pmem_fd = (OMX_U32) fd;
5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.offset = (OMX_U32) offset;
5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.entry = (void *) &pmem_info;
5836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.entryList = &pmem_entry;
5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.nEntries = 1;
5839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ouput_egl_buffers = true;
5840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
5841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
5842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_U8 *)pmemPtr)) {
5843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
5844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorInsufficientResources;
5845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return OMX_ErrorNone;
5847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentRoleEnum
5852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Component Role Enum method implementation.
5855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything is successful.
5861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
5863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_OUT OMX_U8*        role,
5864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_IN OMX_U32        index)
5865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
5867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
5869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
5873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
5881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
5893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
5897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
5907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
5908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          )
5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
5923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
5927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
5936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
5937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           )
5938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
5942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
5953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInvalidComponentName;
5954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
5956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateDone
5964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if entire buffer pool is allocated by IL Client or not.
5967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Need this to move to IDLE state.
5968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false.
5974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void)
5977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
5979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet_In = false;
5980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet_Out = false;
5981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bRet_In = allocate_input_done();
5983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bRet_Out = allocate_output_done();
5984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bRet_In && bRet_Out)
5986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bRet = true;
5988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
5991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateInputDone
5995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if I/P buffer pool is allocated by IL Client or not.
5998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false.
6004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void)
6007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0;
6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_mem_ptr == NULL)
6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return bRet;
6014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_inp_mem_ptr )
6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;i<drv_ctx.ip_buf.actualcount;i++)
6018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_inp_bm_count,i))
6020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i == drv_ctx.ip_buf.actualcount)
6026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
6029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
6031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_inp_bPopulated = OMX_TRUE;
6033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
6037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
6038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateOutputDone
6039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
6041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if entire O/P buffer pool is allocated by IL Client or not.
6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false.
6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void)
6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned j=0;
6054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr == NULL)
6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return bRet;
6058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
6061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;j < drv_ctx.op_buf.actualcount;j++)
6063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_out_bm_count,j))
6065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(j == drv_ctx.op_buf.actualcount)
6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_bEnabled)
6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_out_bPopulated = OMX_TRUE;
6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
6084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ReleaseDone
6085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
6087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if IL client has released all the buffers.
6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void)
6097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(release_input_done())
6101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(release_output_done())
6103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bRet = true;
6105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
6112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
6113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ReleaseOutputDone
6114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
6116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if IL client has released all the buffers.
6117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
6123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void)
6126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0,j=0;
6129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
6131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_out_mem_ptr)
6132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j < drv_ctx.op_buf.actualcount ; j++)
6134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(BITMASK_PRESENT(&m_out_bm_count,j))
6136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
6138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j == drv_ctx.op_buf.actualcount)
6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_out_bm_count = 0;
6143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bRet = true;
6144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_bm_count = 0;
6149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
6150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
6154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
6155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ReleaseInputDone
6156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
6158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if IL client has released all the buffers.
6159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
6165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void)
6168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0,j=0;
6171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
6173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_inp_mem_ptr)
6174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j<drv_ctx.ip_buf.actualcount;j++)
6176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if( BITMASK_PRESENT(&m_inp_bm_count,j))
6178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
6180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j==drv_ctx.ip_buf.actualcount)
6183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bRet = true;
6185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
6190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
6195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_BUFFERHEADERTYPE * buffer)
6196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
6198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
6199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
6201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (output_flush_progress)
6204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
6206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
6207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nTimeStamp = 0;
6208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
6209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
6211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer, buffer->pBuffer);
6215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_output_buffers --;
6216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Output EOS has been reached");
6220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!output_flush_progress)
6221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
6222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame)
6224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
6226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = NULL;
6227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame)
6229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFilledLen = 0;
6231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
6232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame = NULL;
6233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
6237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputBufferFile1)
6239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite (buffer->pBuffer,1,buffer->nFilledLen,
6241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  outputBufferFile1);
6242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* For use buffer we need to copy the data */
6246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!output_flush_progress)
6247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.get_next_timestamp(buffer,
6249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
6250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ?true:false);
6251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_cb.FillBufferDone)
6253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFilledLen > 0)
6255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata)
6257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        handle_extradata(buffer);
6258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep min timestamp interval to handle corrupted bit stream scenario
6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        set_frame_rate(buffer->nTimeStamp);
6261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (arbitrary_bytes)
6262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        adjust_timestamp(buffer->nTimeStamp);
6263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (perf_flag)
6264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!proc_frms)
6266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.stop();
6268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          latency = dec_time.processing_time_us() - latency;
6269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
6270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.start();
6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.start();
6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        proc_frms++;
6274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_U64 proc_time = 0;
6277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.stop();
6278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_time = fps_metrics.processing_time_us();
6279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
6280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            proc_frms, (float)proc_time / 1e6,
6281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (float)(1e6 * proc_frms) / proc_time);
6282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_frms = 0;
6283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputExtradataFile)
6288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
6291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *)
6292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           ((unsigned)(buffer->pBuffer + buffer->nOffset +
6293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen + 3)&(~3));
6294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra &&
6295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) )
6296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
6298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
6299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == OMX_ExtraDataNone)
6300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
6304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
6309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = LLONG_MAX;
6310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rst_prev_ts = true;
6311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
6314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
6315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->pPlatformPrivate)->entryList->entry;
6316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
6317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
6318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
6319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (native_buffer[buffer - m_out_mem_ptr].inuse) {
6321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
6322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Unlocking genlock failed");
6323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
6326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        native_buffer[buffer - m_out_mem_ptr].inuse = false;
6327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
6329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.FillBufferDone (hComp,m_app_data,buffer);
6332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
6333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
6340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
6343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_BUFFERHEADERTYPE* buffer)
6344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
6347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
6349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorBadParameter;
6350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer, buffer->pBuffer);
6354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_input_buffers--;
6355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (arbitrary_bytes)
6357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pdest_frame == NULL && input_flush_progress == false)
6359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
6361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = buffer;
6362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
6363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nTimeStamp = LLONG_MAX;
6364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        push_input_buffer (hComp);
6365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
6369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
6370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL))
6371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
6373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_cb.EmptyBufferDone)
6377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
6379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (input_use_buffer == true){
6380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message)
6389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec* omx = NULL;
6391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_msginfo *vdec_msg = NULL;
6392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
6393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_buffer *v4l2_buf_ptr=NULL;
6394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_output_frameinfo *output_respbuf = NULL;
6395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc=1;
6396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (context == NULL || message == NULL)
6397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
6399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
6400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  vdec_msg = (struct vdec_msginfo *)message;
6402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx = reinterpret_cast<omx_vdec*>(context);
6404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (omx->m_debug_timestamp)
6407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
6409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         !(omx->output_flush_progress) )
6410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_TICKS expected_ts = 0;
6412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->m_timestamp_list.pop_min_ts(expected_ts);
6413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
6414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
6415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
6417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
6419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (vdec_msg->msgcode)
6425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_HW_ERROR:
6428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event (NULL,vdec_msg->status_code,\
6429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_START_DONE:
6433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event (NULL,vdec_msg->status_code,\
6434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_START_DONE);
6435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_STOP_DONE:
6438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event (NULL,vdec_msg->status_code,\
6439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_STOP_DONE);
6440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_RESUME_DONE:
6443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event (NULL,vdec_msg->status_code,\
6444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_RESUME_DONE);
6445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_PAUSE_DONE:
6448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event (NULL,vdec_msg->status_code,\
6449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
6453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event (NULL,vdec_msg->status_code,\
6454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
6455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event (NULL,vdec_msg->status_code,\
6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_INPUT_FLUSHED:
6461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // omxhdr = (OMX_BUFFERHEADERTYPE* )		\
6464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //        vdec_msg->msgdata.input_frame_clientdata;
6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
6468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omxhdr == NULL ||
6469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
6470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       omxhdr = NULL;
6472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       vdec_msg->status_code = VDEC_S_EFATAL;
6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
6477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
6479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int64_t *timestamp;
6480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      timestamp = (int64_t *) malloc(sizeof(int64_t));
6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (timestamp) {
6482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
6484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
6485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             vdec_msg->msgdata.output_frame.time_stamp);
6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
6491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
6494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
6496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		      vdec_msg->msgdata.output_frame.pic_type);
6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omxhdr && omxhdr->pOutputPortPrivate &&
6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
6500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
6502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
6504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
6506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
6507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nTimeStamp = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nTimeStamp;
6508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
6509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)
6511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
6512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
6513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  //rc = -1;
6514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
6515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	vdec_msg->msgdata.output_frame.bufferaddr=omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
6516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf = (struct vdec_output_frameinfo *)\
6517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          omxhdr->pOutputPortPrivate;
6518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->framesize.bottom =
6519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //  vdec_msg->msgdata.output_frame.framesize.bottom;
6520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->framesize.left =
6521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	//   vdec_msg->msgdata.output_frame.framesize.left;
6522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->framesize.right =
6523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	//   vdec_msg->msgdata.output_frame.framesize.right;
6524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->framesize.top =
6525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	//   vdec_msg->msgdata.output_frame.framesize.top;
6526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
6527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
6528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
6530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
6531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
6532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (omx->output_use_buffer)
6534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ( omxhdr->pBuffer,
6535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (vdec_msg->msgdata.output_frame.bufferaddr +
6536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.offset),
6537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.len );
6538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nFilledLen = 0;
6541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
6542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_FBD);
6543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
6545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EOS_DONE);
6547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_CONFIG_CHANGED:
6552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed");
6553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_PORT_RECONFIG);
6555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
6557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed info");
6559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // get_buffer_req and populate port defn structure
6560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
6561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->m_port_def.nPortIndex = 1;
6562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = omx->update_portdef(&(omx->m_port_def));
6563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
6565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
6568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return rc;
6571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
6574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   OMX_HANDLETYPE hComp,
6575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   OMX_BUFFERHEADERTYPE *buffer
6576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                           )
6577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned address,p2,id;
6579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Empty this arbitrary");
6580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer == NULL)
6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
6586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
6587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
6588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
6590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return buffer if input flush in progress */
6591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
6592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
6595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
6596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (psource_frame == NULL)
6600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
6602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psource_frame = buffer;
6603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
6604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    push_input_buffer (hComp);
6605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
6609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL))
6610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned address,p2,id;
6622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
6623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (pdest_frame == NULL || psource_frame == NULL)
6625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if we have a destination buffer*/
6627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame == NULL)
6628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
6630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_free_q.m_size)
6631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_free_q.pop_entry(&address,&p2,&id);
6633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
6634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFilledLen = 0;
6635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = LLONG_MAX;
6636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
6637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if we have a destination buffer*/
6641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame == NULL)
6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
6644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_pending_q.m_size)
6645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_pending_q.pop_entry(&address,&p2,&id);
6647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
6648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
6649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                psource_frame->nTimeStamp);
6650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
6651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame->nFlags,psource_frame->nFilledLen);
6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while ((pdest_frame != NULL) && (psource_frame != NULL))
6659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch (codec_type_parse)
6661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_MPEG4:
6663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_H263:
6664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_MPEG2:
6665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret =  push_input_sc_codec(hComp);
6666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_H264:
6668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = push_input_h264(hComp);
6669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_VC1:
6671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = push_input_vc1(hComp);
6672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ret != OMX_ErrorNone)
6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx_report_error ();
6678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
6683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
6686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 partial_frame = 1;
6688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
6689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned address,p2,id;
6690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
6692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame,psource_frame->nTimeStamp);
6693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_frame_parser.parse_sc_frame(psource_frame,
6694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       pdest_frame,&partial_frame) == -1)
6695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
6697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (partial_frame == 0)
6701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
6703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen,psource_frame,frame_count);
6704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
6707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*First Parsed buffer will have only header Hence skip*/
6708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (frame_count == 0)
6709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
6711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
6713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         codec_type_parse == CODEC_TYPE_DIVX) {
6714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4StreamType psBits;
6715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
6716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.numBytes = pdest_frame->nFilledLen;
6717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4_headerparser.parseHeader(&psBits);
6718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_count++;
6721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
6725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pdest_frame->nFilledLen)
6726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
6728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
6729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
6733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
6734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_input_free_q.m_size)
6736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_input_free_q.pop_entry(&address,&p2,&id);
6738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
6739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen = 0;
6740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
6743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
6745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
6746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
6747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
6753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if Destination Buffer is full*/
6754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame->nAllocLen ==
6755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFilledLen + pdest_frame->nOffset)
6756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
6758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorStreamCorrupt;
6759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (psource_frame->nFilledLen == 0)
6763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
6765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pdest_frame)
6767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags |= psource_frame->nFlags;
6769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
6770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
6771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
6772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,frame_count++);
6773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
6774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
6775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
6784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
6785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(generate_ebd)
6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
6790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = NULL;
6792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_pending_q.m_size)
6794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
6796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_pending_q.pop_entry(&address,&p2,&id);
6797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
6799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                psource_frame->nTimeStamp);
6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
6801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame->nFlags,psource_frame->nFilledLen);
6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 partial_frame = 1;
6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned address,p2,id;
6812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL isNewFrame = OMX_FALSE;
6813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
6814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (h264_scratch.pBuffer == NULL)
6816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
6818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
6821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
6823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (h264_scratch.nFilledLen && look_ahead_nal)
6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
6826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
6827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nFilledLen)
6828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.pBuffer,h264_scratch.nFilledLen);
6831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
6832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
6833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nFilledLen = 0;
6834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
6838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nal_length == 0)
6842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
6844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_sc_frame(psource_frame,
6845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
6846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
6854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_h264_nallength(psource_frame,
6855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
6856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
6858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (partial_frame == 0)
6863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
6865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
6867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nal_count++;
6868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
6869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nFlags = psource_frame->nFlags;
6870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
6874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(h264_scratch.nFilledLen)
6875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
6877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 NALU_TYPE_SPS);
6878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
6879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
6881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
6882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
6883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // If timeinfo is present frame info from SEI is already processed
6884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
6885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
6886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
6888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_count++;
6889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
6890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nTimeStamp = h264_last_au_ts;
6891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFlags = h264_last_au_flags;
6892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR
6893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
6894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_parser->update_panscan_data(h264_last_au_ts);
6895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
6898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
6899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = h264_scratch.nTimeStamp;
6900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_flags = h264_scratch.nFlags;
6901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
6902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
6905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (!VALID_TS(h264_last_au_ts))
6906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_last_au_ts = ts_in_sei;
6907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else
6910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = LLONG_MAX;
6911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!isNewFrame)
6914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
6916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen)
6917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
6919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.nFilledLen);
6920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.pBuffer,h264_scratch.nFilledLen);
6922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
6923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
6924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_scratch.nFilledLen = 0;
6926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
6928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
6930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        look_ahead_nal = true;
6936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
6937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
6938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
6939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,frame_count++);
6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pdest_frame->nFilledLen == 0)
6942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
6944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          look_ahead_nal = false;
6945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
6946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               h264_scratch.nFilledLen)
6947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
6950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen = 0;
6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
6954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
6956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
6960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
6962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Reset the EOS Flag");
6964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /*Push the frame to the Decoder*/
6967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
6968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          //frame_count++;
6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = NULL;
6973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_input_free_q.m_size)
6974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_input_free_q.pop_entry(&address,&p2,&id);
6976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
6977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
6978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen = 0;
6979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags = 0;
6980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = LLONG_MAX;
6981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
6989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if Destination Buffer is full*/
6990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_scratch.nAllocLen ==
6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.nFilledLen + h264_scratch.nOffset)
6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorStreamCorrupt;
6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!psource_frame->nFilledLen)
6999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
7001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
7003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pdest_frame)
7005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
7007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             h264_scratch.nFilledLen)
7009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  h264_scratch.pBuffer,h264_scratch.nFilledLen);
7012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_scratch.nFilledLen = 0;
7014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
7016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
7018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
7021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%d TimeStamp = %x",
7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
7030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!VALID_TS(pdest_frame->nTimeStamp))
7031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = ts_in_sei;
7032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
7035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
7041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame,h264_scratch.nFilledLen);
7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
7047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(generate_ebd && !psource_frame->nFilledLen)
7051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psource_frame = NULL;
7054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_input_pending_q.m_size)
7055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
7057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_pending_q.pop_entry(&address,&p2,&id);
7058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
7059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame->nFlags,psource_frame->nFilledLen);
7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
7064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
7067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U8 *buf, *pdest;
7069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 partial_frame = 1;
7070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 buf_len, dest_len;
7071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(first_frame == 0)
7073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        first_frame = 1;
7075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
7076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_vendor_config.pData)
7077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
7079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buf = psource_frame->pBuffer;
7080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buf_len = psource_frame->nFilledLen;
7081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
7083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                VC1_SP_MP_START_CODE)
7084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_vc1_profile = VC1_SP_MP_RCV;
7086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
7088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_vc1_profile = VC1_AP;
7090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
7092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
7094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorStreamCorrupt;
7095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
7098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
7100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nOffset;
7101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
7102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nOffset);
7103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(dest_len < m_vendor_config.nDataSize)
7105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nDestination buffer full\n");
7107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorBadParameter;
7108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
7110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
7112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
7113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(m_vc1_profile)
7118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case VC1_AP:
7120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
7121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
7122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
7124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorBadParameter;
7125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
7127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case VC1_SP_MP_RCV:
7129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        default:
7130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n");
7131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
7132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
7134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
7137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 alignment)
7138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem_allocation allocation;
7140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.size = buffer_size;
7141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.align = clip2(alignment);
7142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (allocation.align < 4096)
7143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    allocation.align = 4096;
7145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
7147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
7149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
7150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
7151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
7153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
7156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
7157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	      struct ion_fd_data *fd_data, int flag)
7158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int fd = -EINVAL;
7160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -EINVAL;
7161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_dev_flag;
7162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ion ion_buf_info;
7163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!alloc_data || buffer_size <= 0 || !fd_data) {
7164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
7165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return -EINVAL;
7166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode && flag == CACHED)
7168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ion_dev_flag = O_RDONLY;
7170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ion_dev_flag = (O_RDONLY | O_DSYNC);
7172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd = open (MEM_DEVICE, ion_dev_flag);
7174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (fd < 0) {
7175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
7177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->len = buffer_size;
7179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->align = clip2(alignment);
7180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (alloc_data->align < 4096)
7181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->align = 4096;
7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(secure_mode) {
7185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_SECURE);
7186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->flags = ION_HEAP(MEM_HEAP_ID);
7188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
7190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc || !alloc_data->handle) {
7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
7192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->handle = NULL;
7193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
7196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd_data->handle = alloc_data->handle;
7198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_MAP,fd_data);
7199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc) {
7200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION MAP failed ");
7201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_alloc_data = *alloc_data;
7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_device_fd = fd;
7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.fd_ion_data = *fd_data;
7204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_ion_memory(&ion_buf_info);
7205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd_data->fd =-1;
7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return fd;
7211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
7214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(!buf_ion_info) {
7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
7217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return;
7218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
7220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             &buf_ion_info->ion_alloc_data.handle)) {
7221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free failed" );
7222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     close(buf_ion_info->ion_device_fd);
7224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_device_fd = -1;
7225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_alloc_data.handle = NULL;
7226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->fd_ion_data.fd = -1;
7227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
7230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
7232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_use_buffer = false;
7233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ouput_egl_buffers = false;
7234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
7236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (m_out_mem_ptr);
7238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = NULL;
7239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_platform_list)
7242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free(m_platform_list);
7244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_platform_list = NULL;
7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_respbuffer)
7248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_respbuffer);
7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = NULL;
7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_outputbuffer)
7253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_outputbuffer);
7255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = NULL;
7256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
7269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (arbitrary_bytes)
7270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_frame_parser.mutils)
7272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free utils parser");
7274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete (m_frame_parser.mutils);
7275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils = NULL;
7276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_inp_heap_ptr)
7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input Heap Pointer");
7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_inp_heap_ptr);
7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_inp_heap_ptr = NULL;
7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_phdr_pmem_ptr)
7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
7288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_phdr_pmem_ptr);
7289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_phdr_pmem_ptr = NULL;
7290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_mem_ptr)
7293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
7295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (m_inp_mem_ptr);
7296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_inp_mem_ptr = NULL;
7297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer)
7299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Driver Context pointer");
7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (drv_ctx.ptr_inputbuffer);
7302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer = NULL;
7303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
7306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free ion context");
7307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.ip_buf_ion_info);
7308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::stream_off()
7313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc=0;
7315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum v4l2_buf_type btype;
7316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
7318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
7319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*TODO: How to handle this case */
7320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Failed to call streamoff on OUTPUT Port \n");
7321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	} else {
7322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		streaming[CAPTURE_PORT] = false;
7323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
7324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_requestbuffers bufreq;
7330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int buf_size = 0, extra_data_size = 0;
7331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_format fmt;
7332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ret;
7333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	bufreq.memory = V4L2_MEMORY_USERPTR;
7336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(in_reconfig == true)
7337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	bufreq.count = 0;
7338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else
7339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	bufreq.count = 2;
7340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
7341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fmt.fmt.pix_mp.pixelformat = output_capability;
7344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
7345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fmt.fmt.pix_mp.pixelformat = capture_capability;
7348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }else {eRet = OMX_ErrorBadParameter;}
7349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(eRet==OMX_ErrorNone){
7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
7351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(ret)
7353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	/*TODO: How to handle this case */
7356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
7357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	return eRet;
7358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_prop->actualcount = bufreq.count;
7362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_prop->mincount = bufreq.count;
7363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  printf("Count = %d \n ",bufreq.count);
7364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
7369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
7370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
7372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_resolution.frame_height = fmt.fmt.pix_mp.height;
7374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_resolution.frame_width = fmt.fmt.pix_mp.width;
7375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  printf("Buffer Size = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
7377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(ret)
7379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	/*TODO: How to handle this case */
7381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
7383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
7387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = buffer_prop->buffer_size;
7388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
7391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
7392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_INTERLACE_EXTRADATA)
7394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Interlace extra data enabled!");
7396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
7397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_PORTDEF_EXTRADATA)
7399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
7401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
7402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         extra_data_size);
7403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (extra_data_size)
7405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
7407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
7408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size += extra_data_size;
7410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
7412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
7413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig) // BufReq will be set to driver when port is disabled
7414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (buf_size != buffer_prop->buffer_size)
7416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = set_buffer_req(buffer_prop);
7419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
7422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
7427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned buf_size = 0;
7430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_format fmt;
7431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ret;
7432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
7433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buf_size != buffer_prop->buffer_size)
7436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
7438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size, buf_size);
7439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadParameter;
7440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
7444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
7445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
7446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.pixelformat = output_capability;
7448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
7449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevfmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.pixelformat = capture_capability;
7451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} else {eRet = OMX_ErrorBadParameter;}
7452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
7453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ret)
7454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  /*TODO: How to handle this case */
7456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Setting buffer requirements failed");
7457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInsufficientResources;
7458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::start_port_reconfig()
7464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  enum v4l2_buf_type btype;
7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = 0,i;
7469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_plane plane;
7470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_buffer v4l2_buf ={0};
7471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_decoder_cmd dec;
7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  dec.cmd = V4L2_DEC_CMD_STOP;
7473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec);
7474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  in_reconfig = true;
7476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
7484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = &drv_ctx.video_resolution;
7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg)*/0)
7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
7488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorHardware;
7489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!portDefn)
7497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
7501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nSize = sizeof(portDefn);
7503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->eDomain    = OMX_PortDomainVideo;
7504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.frame_rate.fps_denominator > 0)
7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        drv_ctx.frame_rate.fps_denominator;
7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else {
7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (0 == portDefn->nPortIndex)
7512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirInput;
7514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
7515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
7516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = eCompressionFormat;
7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_inp_bEnabled;
7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_inp_bPopulated;
7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (1 == portDefn->nPortIndex)
7523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirOutput;
7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet=get_buffer_req(&drv_ctx.op_buf);
7526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig)
7527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = op_buf_rcnfg.mincount;
7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = op_buf_rcnfg.buffer_size;
7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
7535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = drv_ctx.op_buf.buffer_size;
7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_out_bEnabled;
7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_out_bPopulated;
7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
7546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR: Color format unknown: %x\n", drv_ctx.output_format);
7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir = OMX_DirMax;
7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->nPortIndex);
7556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
7557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
7559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("update_portdef Width = %d Height = %d Stride = %u"
7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "SliceHeight = %u \n", portDefn->format.video.nFrameHeight,
7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nFrameWidth,
7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nStride,
7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nSliceHeight);
7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
7575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i= 0;
7576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_out_mem_ptr) {
7578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
7579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nBufHdrSize        = 0;
7580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformEntrySize = 0;
7581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformListSize  = 0;
7582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPMEMInfoSize = 0;
7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
7594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
7597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
7598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
7600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE),
7601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPMEMInfoSize,
7602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPlatformListSize);
7603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         m_out_bm_count);
7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Alloc mem for platform specific info
7607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *pPtr=NULL;
7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     nPMEMInfoSize,1);
7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer)
7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufHdr          =  m_out_mem_ptr;
7625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
7627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_list)  + nPlatformListSize);
7628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
7629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_entry) + nPlatformEntrySize);
7630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList   = m_platform_list;
7631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry  = m_platform_entry;
7632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo       = m_pmem_info;
7633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
7635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Settting the entire storage nicely
7637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
7638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_ptr,pPlatformEntry);
7639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
7640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
7641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
7643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
7644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Set the values when we determine the right HxW param
7645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nFilledLen         = 0;
7647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
7648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
7650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->entry      = pPMEMInfo;
7651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform List
7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->nEntries    = 1;
7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->entryList   = pPlatformEntry;
7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep pBuffer NULL till vdec is opened
7655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pBuffer            = NULL;
7656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->pmem_fd = 0;
7658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pPlatformPrivate = pPlatformList;
7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Create a mapping between buffers*/
7664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
7665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
7667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Move the buffer and buffer header pointers
7668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr++;
7669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo++;
7670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry++;
7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList++;
7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
7677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        m_out_mem_ptr, pPtr);
7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_out_mem_ptr)
7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_out_mem_ptr);
7681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_out_mem_ptr = NULL;
7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPtr)
7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPtr);
7686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPtr = NULL;
7687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
7694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
7697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =  OMX_ErrorInsufficientResources;
7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet =  OMX_ErrorInsufficientResources;
7709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p1;
7716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p2;
7717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned ident;
7718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_cmd_queue tmp_q, pending_bd_q;
7719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
7720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE FDB from ftb queue
7721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_ftb_q.m_size)
7722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.pop_entry(&p1,&p2,&ident);
7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_FBD)
7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to ftb queue
7734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
7735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.insert_entry(p1,p2,ident);
7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE EDB from etb queue
7740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_etb_q.m_size)
7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.pop_entry(&p1,&p2,&ident);
7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_EBD)
7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
7746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
7750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to etb queue
7753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.insert_entry(p1,p2,ident);
7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // process all pending buffer dones
7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(pending_bd_q.m_size)
7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_bd_q.pop_entry(&p1,&p2,&ident);
7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(ident)
7764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_EBD:
7766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
7767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
7769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
7770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
7772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_FBD:
7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
7785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 new_frame_interval = 0;
7787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
7789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
7790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    new_frame_interval = (act_timestamp > prev_ts)?
7792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          act_timestamp - prev_ts :
7793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          prev_ts - act_timestamp;
7794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (new_frame_interval < frm_int || frm_int == 0)
7795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frm_int = new_frame_interval;
7797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(frm_int)
7798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_numerator = 1e6;
7800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_denominator = frm_int;
7801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
7802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         frm_int, drv_ctx.frame_rate.fps_numerator /
7803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         (float)drv_ctx.frame_rate.fps_denominator);
7804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl_msg.in = &drv_ctx.frame_rate;
7805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
7806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (void*)&ioctl_msg) < */0)
7807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("Setting frame rate failed");
7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prev_ts = act_timestamp;
7814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
7817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rst_prev_ts && VALID_TS(act_timestamp))
7819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = act_timestamp;
7821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = false;
7822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (VALID_TS(prev_ts))
7824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bool codec_cond = (drv_ctx.timestamp_adjust)?
7826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
7827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
7828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
7829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(frm_int > 0 && codec_cond)
7830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
7832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      act_timestamp = prev_ts + frm_int;
7833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
7834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = act_timestamp;
7835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(act_timestamp);
7838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (frm_int > 0)           // In this case the frame rate was set along
7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {                               // with the port definition, start ts with 0
7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_conceal_MB = 0;
7850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_S64 ts_in_sei = 0;
7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 frame_rate = 0;
7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_extra = (OMX_OTHER_EXTRADATATYPE *)
7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
7854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_buf_hdr->nFilledLen + 3)&(~3));
7855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = NULL;
7857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
7858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Process driver extradata
7860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
7861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->nSize < p_extra->nDataSize)
7865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
7867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          p_extra->nSize, p_extra->nDataSize);
7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
7870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_extra->nDataSize == 0)
7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra = NULL;
7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          continue;
7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          num_conceal_MB = count_MB_in_extradata(p_extra);
7878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Map driver extradata to corresponding OMX type
7880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
7881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_debug_concealedmb) {
7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_SEI)
7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_sei = p_extra;
7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
7894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_VUI)
7896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_vui = p_extra;
7898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
7900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
7902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      print_debug_extradata(p_extra);
7904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
7906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->nDataSize == 0)
7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = NULL;
7908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
7910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Driver extradata is only exposed if MB map is requested by client,
7912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // otherwise can be overwritten by omx extradata.
7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *)
7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
7915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                p_buf_hdr->nFilledLen + 3)&(~3));
7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_vui)
7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
7927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_sei)
7928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
7930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!VALID_TS(p_buf_hdr->nTimeStamp))
7931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp = ts_in_sei;
7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // If timeinfo is present frame info from SEI is already processed
7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_interlace_extradata(p_extra,
7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format);
7945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
7952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* vui extra data (frame_rate) information */
7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_rate(&frame_rate);
7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_frame_info_extradata(p_extra, num_conceal_MB,
7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp, frame_rate, NULL);
7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       p_extra != NULL &&
7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
7966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_portdef_extradata(p_extra);
7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (p_extra &&
7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      append_terminator_extradata(p_extra);
7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
7978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 driver_extradata = 0, extradata_size = 0;
7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state != OMX_StateLoaded)
7987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
7989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorIncorrectStateOperation;
7990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
7992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_INTERLACE_EXTRADATA)
7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_PORTDEF_EXTRADATA)
7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata, requested_extradata, enable);
8001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (enable)
8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata |= client_extradata;
8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata = client_extradata & ~requested_extradata;
8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size *= -1;
8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
8012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
8013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
8014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
8019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
8020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (driver_extradata != drv_ctx.extradata)
8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.extradata = driver_extradata;
8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //ioctl_msg.in = &drv_ctx.extradata;
8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //ioctl_msg.out = NULL;
8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //    (void*)&ioctl_msg) < 0)
8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //{
8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //  DEBUG_PRINT_ERROR("\nSet extradata failed");
8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //  ret = OMX_ErrorUnsupportedSetting;
8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //}   // else
8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // ret = get_buffer_req(&drv_ctx.op_buf);
8036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
8038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_size += extradata_size;
8041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // align the buffer size
8042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1));
8043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size);
8044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
8045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
8046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  ret = set_buffer_req(&drv_ctx.op_buf);
8047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
8054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *data_ptr = extra->data, data = 0;
8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (byte_count < extra->nDataSize)
8056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data = *data_ptr;
8058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (data)
8059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      num_MB += (data&0x01);
8061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      data >>= 1;
8062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data_ptr++;
8064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    byte_count++;
8065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
8067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
8068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
8069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_debug_extradata)
8074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return;
8075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH(
8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "============== Extra Data ==============\n"
8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Size: %u \n"
8079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "        Version: %u \n"
8080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "      PortIndex: %u \n"
8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Type: %x \n"
8082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "       DataSize: %u \n",
8083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nSize, extra->nVersion.nVersion,
8084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nPortIndex, extra->eType, extra->nDataSize);
8085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (extra->eType == OMX_ExtraDataInterlaceFormat)
8087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "------ Interlace Format ------\n"
8091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "                Size: %u \n"
8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Version: %u \n"
8093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           PortIndex: %u \n"
8094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Is Interlace Format: %u \n"
8095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Interlace Formats: %u \n"
8096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "=========== End of Interlace ===========\n",
8097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
8098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataFrameInfo)
8101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "-------- Frame Format --------\n"
8106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Picture Type: %u \n"
8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Interlace Type: %u \n"
8108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Pan Scan Total Frame Num: %u \n"
8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Concealed Macro Blocks: %u \n"
8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "               frame rate: %u \n"
8111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio X: %u \n"
8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio Y: %u \n",
8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->ePicType,
8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->interlaceType,
8115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->panScan.numWindows,
8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nConcealedMacroblocks,
8117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nFrameRate,
8118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioX,
8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioY);
8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (int i = 0; i < fminfo->panScan.numWindows; i++)
8122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH(
8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "------------------------------\n"
8125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "     Pan Scan Frame Num: %d \n"
8126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle x: %d \n"
8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle y: %d \n"
8128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dx: %d \n"
8129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dy: %d \n",
8130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
8132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
8135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataNone)
8137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
8139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
8143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_U32 interlaced_format_type)
8148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STREAMINTERLACEFORMAT *interlace_format;
8150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 mbaff = 0;
8151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
8152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
8155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
8159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
8161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((interlaced_format_type == VDEC_InterlaceFrameProgressive)  && !mbaff)
8162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_FALSE;
8164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
8165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
8166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_TRUE;
8170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
8171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
8172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp, OMX_U32 frame_rate,
8179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	vdec_aspectratioinfo *aspect_ratio_info)
8180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
8182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
8183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
8186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
8187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (picture_type)
8189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_I:
8191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
8192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_P:
8194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
8195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_B:
8197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
8198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
8200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
8201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
8203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
8204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
8205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
8206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
8208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->panScan,0,sizeof(frame_info->panScan));
8209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
8210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
8213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_parser->fill_aspect_ratio_info(&frame_info->aspectRatio);
8214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nConcealedMacroblocks = num_conceal_mb;
8216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nFrameRate = frame_rate;
8217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
8223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
8224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
8227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
8228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
8229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  *portDefn = m_port_def;
8230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
8231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nFrameWidth,
8233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nStride,
8234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nSliceHeight);
8235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
8240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = OMX_ExtraDataNone;
8242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = 0;
8243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->data[0] = 0;
8244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
8249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
8251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index >= drv_ctx.ip_buf.actualcount)
8252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
8254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr = (desc_buffer_hdr*) \
8259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(desc_buffer_hdr)),
8260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
8261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_desc_buffer_ptr == NULL)
8262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
8264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
8269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr[index].buf_addr == NULL)
8270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
8272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
8279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
8281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_demux_entries < 8192)
8282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_offsets[m_demux_entries++] = address_offset;
8284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
8289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
8291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
8292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 index = 0;
8293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (index < bytes_to_parse)
8297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
8300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x01)) )
8302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //Found start code, insert address offset
8304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      insert_demux_addr_offset(index);
8305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf[index+2] == 0x01) // 3 byte start code
8306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 3;
8307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else                      //4 byte start code
8308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 4;
8309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index++;
8312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
8314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //fix this, handle 3 byte start code, vc1 terminator entry
8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *p_demux_data = NULL;
8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 desc_data = 0;
8322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 start_addr = 0;
8323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 nal_size = 0;
8324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 suffix_byte = 0;
8325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 demux_index = 0;
8326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 buffer_index = 0;
8327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
8335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer_index > drv_ctx.ip_buf.actualcount)
8336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index);
8338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ( ((OMX_U8*)p_demux_data == NULL) ||
8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
8345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (; demux_index < m_demux_entries; demux_index++)
8352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      start_addr = m_demux_offsets[demux_index];
8355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
8356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
8362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (demux_index < (m_demux_entries - 1))
8364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
8366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
8370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
8372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        start_addr,
8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        suffix_byte,
8374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nal_size,
8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        demux_index);
8376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = (start_addr >> 3) << 1;
8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= (start_addr & 7) << 21;
8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= suffix_byte << 24;
8379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
8382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (codec_type_parse == CODEC_TYPE_VC1)
8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("VC1 terminator entry");
8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0x82 << 24;
8392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
8394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_demux_entries++;
8398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //Add zero word to indicate end of descriptors
8400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(p_demux_data, 0, sizeof(OMX_U32));
8401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
8403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
8404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
8406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Demux table complete!");
8408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
8409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 0
8412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::createDivxDrmContext( OMX_PTR drmHandle )
8413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = OMX_ErrorNone;
8415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( drmHandle == NULL ) {
8416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\n This clip is not DRM encrypted");
8417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt = NULL;
8418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return err;
8419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     iDivXDrmDecrypt = DivXDrmDecrypt::Create( drmHandle );
8422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (iDivXDrmDecrypt) {
8423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\nCreated DIVX DRM, now calling Init");
8424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
8425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(err!=OMX_ErrorNone) {
8426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR:iDivXDrmDecrypt->Init %d", err);
8427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
8428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
8429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
8430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
8432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
8433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorUndefined;
8434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return err;
8436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8439