1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (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.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * 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#ifdef _ANDROID_
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h"
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv";
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata";
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE        0xC5000000
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK   0xFF000000
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE       0x0F010000
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK   0xF0
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE          0
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE            1
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE         3
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN            4
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS            8
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS            12
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS            24
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE          36
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion"
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extern "C"{
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        #include<utils/Log.h>
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input)
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
126dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg;
127dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_msginfo vdec_msg;
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *buffer;
129dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_plane plane;
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pollfd pfd;
131dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_buffer v4l2_buf ={0};
132dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct v4l2_event dqevent;
133b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand  pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
134dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pfd.fd = omx->drv_ctx.video_driver_fd;
136dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int error_code = 0,rc=0;
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (1)
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		rc = poll(&pfd, 1, TIMEOUT);
142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!rc) {
143dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("Poll timedout\n");
144dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			break;
145dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		} else if (rc < 0) {
146dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("Error while polling: %d\n", rc);
147dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			break;
148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
150dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
151dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
152dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.length = 1;
153dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.m.planes = &plane;
154dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
155dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if (rc) {
156dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				/*TODO: How to handle this case */
157dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				printf("Failed to dequeue buf: %d from capture capability\n", rc);
158dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				break;
159dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			}
160dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			vdec_msg.status_code=VDEC_S_SUCCESS;
162dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
163dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			vdec_msg.msgdata.output_frame.len=plane.bytesused;
164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane.m.userptr;
165dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
166dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		else if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
167dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
168dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
169dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.m.planes = &plane;
170dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
171dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if (rc) {
172dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				/*TODO: How to handle this case */
173dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				printf("Failed to dequeue buf: %d from output capability\n", rc);
174dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				break;
175dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			}
176dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
177dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			vdec_msg.status_code=VDEC_S_SUCCESS;
178dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
179dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		} else if (pfd.revents & POLLPRI){
180dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
181dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if(dqevent.u.data[0] == MSM_VIDC_DECODER_EVENT_CHANGE){
182dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
183dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				vdec_msg.status_code=VDEC_S_SUCCESS;
184dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				printf("\n VIDC Port Reconfig recieved \n");
185dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			} else if (dqevent.u.data[0] == MSM_VIDC_DECODER_FLUSH_DONE){
186dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
187dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				vdec_msg.status_code=VDEC_S_SUCCESS;
188dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				printf("\n VIDC Flush Done Recieved \n");
189dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			} else
190dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				printf("\n VIDC Some Event recieved \n");
191dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		} else if (pfd.revents & POLLERR){
192dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("\n async_message_thread Exited \n");
193dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			break;
194dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		} else{
19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan			/*TODO: How to handle this case */
196dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			continue;
197dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
198dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
199dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (omx->async_message_process(input,&vdec_msg) < 0) {
200dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("\n async_message_thread Exited  \n");
201dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				break;
202dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
204dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return NULL;
206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input)
209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char id;
212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int n;
213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (1)
217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    n = read(omx->m_pipe_in, &id, 1);
220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(0 == n)
222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (1 == n)
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx->process_event_cb(omx, id);
229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ((n < 0) && (errno != EINTR))
231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id)
241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int ret_value;
243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ret_value = write(omx->m_pipe_out, &id, 1);
245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor
249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue()
250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // Nothing to do
252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor
255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert
261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_q[m_write].id       = id;
267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_q[m_write].param1   = p1;
268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_q[m_write].param2   = p2;
269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_write++;
270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_size ++;
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_write = 0;
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_size > 0)
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *id = m_q[m_read].id;
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *p1 = m_q[m_read].param1;
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *p2 = m_q[m_read].param2;
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Move the read pointer ahead
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ++m_read;
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    --m_size;
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_read = 0;
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return m_q[m_read].id;
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //initialize timestamps array
318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //free m_ts_arr_list?
323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool duplicate_ts = false;
329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //insert at the first available empty location
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_ts_arr_list[idx].valid)
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found invalid or empty entry, save timestamp
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].valid = true;
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].timestamp = ts;
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       ts, idx);
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int min_idx = -1;
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_TICKS min_ts = 0;
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_ts_arr_list[idx].valid)
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found valid entry, save index
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (min_idx < 0)
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //first valid entry
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (m_ts_arr_list[idx].timestamp < min_ts)
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (min_idx < 0)
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //no valid entries found
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = 0;
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = m_ts_arr_list[min_idx].timestamp;
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[min_idx].valid = false;
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     ts, min_idx);
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[idx].valid = false;
410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances
416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void)
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return (new omx_vdec);
419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     struct ion_handle *handle, int ionMapfd)
425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
426dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base)
430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // dup file descriptor, map once, use pmem
432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::omx_vdec
439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Constructor
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
449dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandomx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_app_data(NULL),
451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_inp_mem_ptr(NULL),
452dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_out_mem_ptr(NULL),
453dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_phdr_pmem_ptr(NULL),
454dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      pending_input_buffers(0),
455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      pending_output_buffers(0),
456dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_out_bm_count(0),
457dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_inp_bm_count(0),
458dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_inp_bPopulated(OMX_FALSE),
459dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_out_bPopulated(OMX_FALSE),
460dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_flags(0),
461dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_inp_bEnabled(OMX_TRUE),
462dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_out_bEnabled(OMX_TRUE),
463dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_platform_list(NULL),
464dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_platform_entry(NULL),
465dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_pmem_info(NULL),
466dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      output_flush_progress (false),
467dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      input_flush_progress (false),
468dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      input_use_buffer (false),
469dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      output_use_buffer (false),
470dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      arbitrary_bytes (true),
471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      psource_frame (NULL),
472dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      pdest_frame (NULL),
473dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_inp_heap_ptr (NULL),
474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_heap_inp_bm_count (0),
475dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      codec_type_parse ((codec_type)0),
476dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      first_frame_meta (true),
477dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      frame_count (0),
478dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      nal_length(0),
479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      nal_count (0),
480dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      look_ahead_nal (false),
481dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      first_frame(0),
482dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      first_buffer(NULL),
483dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      first_frame_size (0),
484dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_error_propogated(false),
485dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_device_file_ptr(NULL),
486dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_vc1_profile((vc1_profile_type)0),
487dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      prev_ts(LLONG_MAX),
488dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      rst_prev_ts(true),
489dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      frm_int(0),
490dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_in_alloc_cnt(0),
491dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_display_id(NULL),
492dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      ouput_egl_buffers(false),
493dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      h264_parser(NULL),
494dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      client_extradata(0),
495dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      h264_last_au_ts(LLONG_MAX),
496dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      h264_last_au_flags(0),
497dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_inp_err_count(0),
498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
499dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_heap_ptr(NULL),
500dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_enable_android_native_buffers(OMX_FALSE),
501dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_use_android_native_buffers(OMX_FALSE),
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
503dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      in_reconfig(false),
504dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_use_output_pmem(OMX_FALSE),
505dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_out_mem_region_smi(OMX_FALSE),
506dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_out_pvt_entry_pmem(OMX_FALSE),
507dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      secure_mode(false)
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
509dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    ,iDivXDrmDecrypt(NULL)
510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
511dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    ,m_desc_buffer_ptr(NULL)
512dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    ,streaming({false, false})
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Assumption is that , to begin with , we have all the frames with decoder */
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Constructor");
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char property_value[PROPERTY_VALUE_MAX] = {0};
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.perf", property_value, "0");
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  perf_flag = atoi(property_value);
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.start();
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    proc_frms = latency = 0;
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
526dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  property_value[0] = NULL;
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.ts", property_value, "0");
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_timestamp = atoi(property_value);
529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.set_timestamp_reorder_mode(true);
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  property_value[0] = NULL;
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.concealedmb", property_value, "0");
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_concealedmb = atoi(property_value);
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&m_cmp,0,sizeof(m_cmp));
542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&m_cb,0,sizeof(m_cb));
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (&drv_ctx,0,sizeof(drv_ctx));
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
546dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.timestamp_adjust = false;
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_driver_fd = -1;
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_vendor_config.pData = NULL;
552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_init(&m_lock, NULL);
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  sem_init(&m_cmd_lock,0,0);
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char extradata_value[PROPERTY_VALUE_MAX] = {0};
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.extradata", extradata_value, "0");
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_extradata = atoi(extradata_value);
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::~omx_vdec
567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Destructor
570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec()
578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_pmem_info = NULL;
580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Destructor");
581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_pipe_in) close(m_pipe_in);
582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_pipe_out) close(m_pipe_out);
583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_pipe_in = -1;
584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_pipe_out = -1;
585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_join(msg_thread_id,NULL);
587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_join(async_thread_id,NULL);
589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  close(drv_ctx.video_driver_fd);
590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_destroy(&m_lock);
591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  sem_destroy(&m_cmd_lock);
592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.end();
596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::OMXCntrlProcessMsgCb
603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  IL Client callbacks are generated through this routine. The decoder
606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  provides the thread context for this routine.
607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ctxt -- Context information related to the self.
610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  id   -- Event identifier. This could be any of the following:
611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          1. Command completion event
612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          2. Buffer done callback event
613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          3. Frame done callback event
614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
621dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned p1; // Parameter - 1
622dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned p2; // Parameter - 2
623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned ident;
624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned qsize=0; // qsize
625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec *pThis = (omx_vdec *) ctxt;
626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!pThis)
628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        __func__);
631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return;
632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // Protect the shared queue data structure
635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  do
636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Read the message id's from the queue*/
638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&pThis->m_lock);
639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    qsize = pThis->m_cmd_q.m_size;
640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(qsize)
641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
642dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      qsize = pThis->m_ftb_q.m_size;
648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (qsize)
649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
650dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      qsize = pThis->m_etb_q.m_size;
657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (qsize)
658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
659dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&pThis->m_lock);
663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*process message if we have one*/
665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(qsize > 0)
666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      id = ident;
668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      switch (id)
669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EVENT:
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            switch (p1)
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_CommandStateSet:
676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = (OMX_STATETYPE) p2;
677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_state);
679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_EventCmdComplete, p1, p2, NULL);
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_EventError:
684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(p2 == OMX_StateInvalid)
685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_state = (OMX_STATETYPE) p2;
688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                else if (p2 == OMX_ErrorHardware)
692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   pThis->omx_report_error();
694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                else
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		  {
697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
698dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                      OMX_EventError, p2, NULL, NULL );
699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_CommandPortDisable:
703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  break;
709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig)
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
712dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  pThis->op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				  OMX_ERRORTYPE eRet = OMX_ErrorNone;
714dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				  pThis->stream_off();
715dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				  OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->op_buf_rcnfg);
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				  pThis->in_reconfig = false;
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if(eRet !=  OMX_ErrorNone)
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pThis->omx_report_error();
721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      break;
722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_EventCmdComplete, p1, p2, NULL );
726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case OMX_CommandPortEnable:
728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_EventCmdComplete, p1, p2, NULL );
731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              default:
734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_EventCmdComplete, p1, p2, NULL );
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                break;
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_ETB:
754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         break;
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_FTB:
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             pThis->omx_report_error ();
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_COMMAND:
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                    (OMX_U32)p2,(OMX_PTR)NULL);
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EBD:
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count++;
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ?true:false);
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count = 0;
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ( pThis->empty_buffer_done(&pThis->m_cmp,
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pThis->omx_report_error ();
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pThis->m_inp_err_count >= MAX_INPUT_ERROR)
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pThis->omx_report_error ();
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            int64_t *timestamp = (int64_t *)p1;
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p1)
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(*timestamp,
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ?true:false);
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free(timestamp);
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_FBD:
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (p2 != VDEC_S_SUCCESS)
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( pThis->fill_buffer_done(&pThis->m_cmp,
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->input_flush_progress)
839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_input_flush();
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_INPUT_FLUSH_PENDING))
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_INPUT_PORT_INDEX,NULL );
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_COMPONENT_IDLE_PENDING))
866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->output_flush_progress)
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
869dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
870dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     if (/*ioctl (pThis->drv_ctx.video_driver_fd,
871dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                VDEC_IOCTL_CMD_STOP,NULL ) < 0*/0)
872dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     {
873dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                       DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
874dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                       pThis->omx_report_error ();
875dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     }
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->output_flush_progress)
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_output_flush();
896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Notify Output Flush done");
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_OUTPUT_PORT_INDEX,NULL );
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Internal flush complete");
919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (BITMASK_PRESENT(&pThis->m_flags,
922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->post_event(OMX_CommandPortDisable,
925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_CORE_OUTPUT_PORT_INDEX,
926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_COMPONENT_GENERATE_EVENT);
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    BITMASK_CLEAR (&pThis->m_flags,
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->input_flush_progress)
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
937dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
938dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    if (/*ioctl (pThis->drv_ctx.video_driver_fd,
939dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                               VDEC_IOCTL_CMD_STOP,NULL ) < */0)
940dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    {
941dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
942dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      pThis->omx_report_error ();
943dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    }
944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_START_DONE:
956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n Move to executing");
971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StateExecuting;
974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_EventCmdComplete,OMX_CommandStateSet,
976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_StateExecuting, NULL);
977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (BITMASK_PRESENT(&pThis->m_flags,
979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_COMPONENT_PAUSE_PENDING))
980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           VDEC_IOCTL_CMD_PAUSE,NULL ) < */0)
983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->omx_report_error ();
986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_PAUSE_DONE:
997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
1001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
1003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
1004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
1006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                //Send the callback now
1012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
1013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StatePause;
1014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_StatePause, NULL);
1017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_RESUME_DONE:
1028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
1029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
1030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
1032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
1034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
1035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
1037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
1039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
1041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
1042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
1043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StateExecuting;
1044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_StateExecuting,NULL);
1047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_STOP_DONE:
1058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
1059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler)
1060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 != VDEC_S_SUCCESS)
1062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
1064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error ();
1065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
1067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
1069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
1070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_state = OMX_StateIdle;
1075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("\n Move to Idle State");
1076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_EventCmdComplete,OMX_CommandStateSet,
1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_StateIdle,NULL);
1079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
1091dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (pThis->start_port_reconfig() != OMX_ErrorNone)
1092dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              pThis->omx_report_error();
1093dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          else
1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1095dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            if (pThis->in_reconfig)
1096dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            {
1097dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if (pThis->m_cb.EventHandler) {
1098dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1099dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
1100dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              } else {
1101dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1102dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              }
1103dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            }
1104dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
1105dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            {
1106dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
1107dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
1108dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1109dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  format = OMX_InterlaceInterleaveFrameTopFieldFirst;
1110dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1111dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1112dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              else //unsupported interlace format; raise a error
1113dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  event = OMX_EventError;
1114dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if (pThis->m_cb.EventHandler) {
1115dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1116dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    event, format, 0, NULL );
1117dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              } else {
1118dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1119dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              }
1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EOS_DONE:
1125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
1126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler) {
1127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->prev_ts = LLONG_MAX;
1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->rst_prev_ts = true;
1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
1138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->omx_report_error ();
1139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
1141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler) {
1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
1146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
1147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        default:
1151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&pThis->m_lock);
1155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    qsize = pThis->m_cmd_q.m_size;
1156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pThis->m_state != OMX_StatePause)
1157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
1158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&pThis->m_lock);
1159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(qsize>0);
1161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentInit
1169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Initialize the component.
1172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ctxt -- Context information related to the self.
1175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  id   -- Event identifier. This could be any of the following:
1176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          1. Command completion event
1177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          2. Buffer done callback event
1178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          3. Frame done callback event
1179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
1182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	OMX_ERRORTYPE eRet = OMX_ErrorNone;
1188dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
1189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_fmtdesc fdesc;
1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_format fmt;
1191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_requestbuffers bufreq;
1192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	unsigned int   alignment = 0,buffer_size = 0;
1193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int fds[2];
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int r,ret=0;
1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	bool codec_ambiguous = false;
1196dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	OMX_STRING device_name = "/dev/video32";
1197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	drv_ctx.video_driver_fd = open("/dev/video32", O_RDWR);
1199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			drv_ctx.video_driver_fd, errno);
1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(drv_ctx.video_driver_fd == 0){
1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.video_driver_fd = open(device_name, O_RDWR);
1205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(drv_ctx.video_driver_fd < 0)
1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
1210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return OMX_ErrorInsufficientResources;
1211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	drv_ctx.frame_rate.fps_denominator = 1;
1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	outputBufferFile1 = fopen (outputfilename, "ab");
1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	outputExtradataFile = fopen (ouputextradatafilename, "ab");
1224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	// Copy the role information which provides the decoder kind
1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	strlcpy(drv_ctx.kind,role,128);
1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE);
1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.timestamp_adjust = true;
1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*Initialize Start Code for MPEG4*/
1237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_MPEG4;
1238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "m4v");
1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
1244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE);
1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingMPEG2;
1250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*Initialize Start Code for MPEG2*/
1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_MPEG2;
1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "mpg");
1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_LOW("\n H263 Decoder selected");
1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingH263;
1264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_H263;
1265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "263");
1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability = V4L2_PIX_FMT_DIVX_311;
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_DIVX;
1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
1287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability = V4L2_PIX_FMT_DIVX;
1289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_DIVX;
1291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_ambiguous = true;
1292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
1300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability = V4L2_PIX_FMT_DIVX;
1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_DIVX;
1304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_ambiguous = true;
1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
1312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		output_capability=V4L2_PIX_FMT_H264;
1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingAVC;
1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_H264;
1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_nal_length(nal_length);
1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "264");
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingWMV;
1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_VC1;
1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "vc1");
1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				OMX_MAX_STRINGNAME_SIZE))
1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eCompressionFormat = OMX_VIDEO_CodingWMV;
1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		codec_type_parse = CODEC_TYPE_VC1;
1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_frame_parser.init_start_codes (codec_type_parse);
1342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		strcat(inputfilename, "vc1");
1344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else
1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		eRet = OMX_ErrorInvalidComponentName;
1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	inputBufferFile1 = fopen (inputfilename, "ab");
1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (eRet == OMX_ErrorNone)
1355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1357dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
1358b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand		capture_capability= V4L2_PIX_FMT_NV12;
1359dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1360dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		struct v4l2_event_subscription sub;
1361dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		sub.type=V4L2_EVENT_ALL;
1362dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1364dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Subscribe Event Failed \n");
1365dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return OMX_ErrorInsufficientResources;
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		struct v4l2_capability cap;
1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1371dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		  printf("Failed to query capabilities\n");
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		  /*TODO: How to handle this case */
1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else {
1374dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		  printf("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				" version = %d, capabilities = %x\n", cap.driver, cap.card,
1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				cap.bus_info, cap.version, cap.capabilities);
1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret=0;
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
1382dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1390dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1394dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1395dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		drv_ctx.video_resolution.frame_height=drv_ctx.video_resolution.scan_lines=240;
1396dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		drv_ctx.video_resolution.frame_width=drv_ctx.video_resolution.stride=320;
1397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.pixelformat = output_capability;
1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			/*TODO: How to handle this case */
1404dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("Failed to set format on capture port\n");
1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1406dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Set Format was successful \n ");
1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (codec_ambiguous) {
1408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (output_capability == V4L2_PIX_FMT_DIVX) {
1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				struct v4l2_control divx_ctrl;
1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
1412dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				} else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
1414dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				} else {
1416dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1419dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				divx_ctrl.value = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
1420dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &fmt);
1421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (ret) {
1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					DEBUG_PRINT_ERROR("Failed to set divx version\n");
1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			} else {
1425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				DEBUG_PRINT_ERROR("Codec should not be ambiguous");
1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1432dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		fmt.fmt.pix_mp.pixelformat = output_capability;
1433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan			/*TODO: How to handle this case */
1436dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("Failed to set format on capture port\n");
1437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Set Format was successful \n ");
1439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*Get the Buffer requirements for input and output ports*/
1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
1443dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		drv_ctx.op_buf.alignment=4096;
1444dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		drv_ctx.ip_buf.alignment=4096;
1445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.extradata = 0;
1447dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		drv_ctx.picture_order = VDEC_ORDER_DECODE;
1448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.idr_only_decoding = 0;
1449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		m_state = OMX_StateLoaded;
1451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		eRet=get_buffer_req(&drv_ctx.ip_buf);
1452dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
1455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (eRet == OMX_ErrorNone && !secure_mode)
1456dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			eRet = enable_extradata(DEFAULT_EXTRADATA);
1457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		{
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (m_frame_parser.mutils == NULL)
1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				m_frame_parser.mutils = new H264_Utils();
1463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (m_frame_parser.mutils == NULL)
1465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				{
1466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					eRet = OMX_ErrorInsufficientResources;
1468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				else
1470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				{
1471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
1472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
1473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.nFilledLen = 0;
1474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					h264_scratch.nOffset = 0;
1475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					if (h264_scratch.pBuffer == NULL)
1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					{
1478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev						DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
1479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev						return OMX_ErrorInsufficientResources;
1480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					}
1481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					m_frame_parser.mutils->initialize_frame_checking_environment();
1482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
1483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			h264_parser = new h264_stream_parser();
1487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (!h264_parser)
1488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
1490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				eRet = OMX_ErrorInsufficientResources;
1491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if(pipe(fds))
1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		{
1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			DEBUG_PRINT_ERROR("pipe creation failed\n");
1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			eRet = OMX_ErrorInsufficientResources;
1498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		else
1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		{
1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			int temp1[2];
1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if(fds[0] == 0 || fds[1] == 0)
1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				if (pipe (temp1))
1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				{
1506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					DEBUG_PRINT_ERROR("pipe creation failed\n");
1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					return OMX_ErrorInsufficientResources;
1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				}
1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				//close (fds[0]);
1510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				//close (fds[1]);
1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				fds[0] = temp1 [0];
1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				fds[1] = temp1 [1];
1513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			m_pipe_in = fds[0];
1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			m_pipe_out = fds[1];
1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			r = pthread_create(&msg_thread_id,0,message_thread,this);
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if(r < 0)
1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			{
1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				eRet = OMX_ErrorInsufficientResources;
1522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (eRet != OMX_ErrorNone)
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_ERROR("\n Component Init Failed");
1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				NULL);
1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		close (drv_ctx.video_driver_fd);
1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		drv_ctx.video_driver_fd = -1;
1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else
1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
1539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1540dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	//memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
1542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	return eRet;
1543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetComponentVersion
1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns the component version.
1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  TBD.
1554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ErrorNone.
1557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_component_version
1560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     (
1561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_HANDLETYPE hComp,
1562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_STRING componentName,
1563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_VERSIONTYPE* componentVersion,
1564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_VERSIONTYPE* specVersion,
1565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_OUT OMX_UUIDTYPE* componentUUID
1566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      )
1567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
1569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
1571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* TBD -- Return the proper version */
1574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (specVersion)
1575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    specVersion->nVersion = OMX_SPEC_VERSION;
1577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
1579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SendCommand
1583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns zero if all the buffers released..
1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
1592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
1595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_COMMANDTYPE cmd,
1596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_U32 param1,
1597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_PTR cmdData
1598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      )
1599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
1601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
1602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
1604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
1607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
1608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
1610dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "to invalid port: %d", param1);
1611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadPortIndex;
1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_wait(&m_cmd_lock);
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n send_command: Command Processed\n");
1616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
1617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SendCommand
1622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns zero if all the buffers released..
1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
1633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
1634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            OMX_IN OMX_COMMANDTYPE cmd,
1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            OMX_IN OMX_U32 param1,
1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            OMX_IN OMX_PTR cmdData
1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            )
1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int bFlag = 1,sem_posted = 0,ret=0;
1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
1644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
1645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_state, eState);
1646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(cmd == OMX_CommandStateSet)
1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
1650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is Loaded */
1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateLoaded)
1655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateIdle)
1657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //if all buffers are allocated or all ports disabled
1659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(allocate_done() ||
1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
1661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
1667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Skip the event notification
1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bFlag = 0;
1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Loaded */
1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateLoaded)
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,\
1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to WaitForResources */
1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateWaitForResources)
1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Since error is None , we will post an event
1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           at the end of this function definition */
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
1686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Executing */
1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateExecuting)
1689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Pause */
1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StatePause)
1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Loaded to Invalid */
1704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateInvalid)
1705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
1707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          eState);
1714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
1715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is IDLE */
1720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateIdle)
1722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateLoaded)
1724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(release_done())
1726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /*
1728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             Since error is None , we will post an event at the end
1729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             of this function definition
1730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          */
1731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
1732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
1736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
1737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Skip the event notification
1738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bFlag = 0;
1739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to Executing */
1742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateExecuting)
1743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
1746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bFlag = 1;
1747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    m_state=OMX_StateExecuting;
1749dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	    printf("Stream On CAPTURE Was successful\n");
1750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to Idle */
1752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateIdle)
1753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
1755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,\
1756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
1758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to WaitForResources */
1760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateWaitForResources)
1761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
1763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Idle to Pause */
1768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StatePause)
1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /*To pause the Video core we need to start the driver*/
1771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
1772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    NULL) < */0)
1773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
1775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           omx_report_error ();
1776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet = OMX_ErrorHardware;
1777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
1779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
1782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           bFlag = 0;
1783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Idle to Invalid */
1786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateInvalid)
1787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
1789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
1791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
1795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
1796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /******************************/
1800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is Executing */
1801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /******************************/
1802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateExecuting)
1803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
1805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Idle */
1806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if(eState == OMX_StateIdle)
1807dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       {
1808dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         /* Since error is None , we will post an event
1809dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         at the end of this function definition
1810dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         */
1811dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
1812dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         //BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
1813dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         if(!sem_posted)
1814dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         {
1815dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           sem_posted = 1;
1816dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           sem_post (&m_cmd_lock);
1817dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           execute_omx_flush(OMX_ALL);
1818dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         }
1819dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         bFlag = 1;
1820dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 int rc=0;
1821dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 enum v4l2_buf_type btype;
1822dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1823dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
1824dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 if (rc) {
1825dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		 /*TODO: How to handle this case */
1826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		 printf("\n Failed to call streamoff on OUTPUT Port \n");
1827dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 } else {
1828dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		 streaming[OUTPUT_PORT] = false;
1829dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 }
1830dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1831dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
1832dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 if (rc) {
1833dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		 /*TODO: How to handle this case */
1834dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		 printf("\n Failed to call streamoff on CAPTURE Port \n");
1835dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 } else {
1836dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		 streaming[CAPTURE_PORT] = false;
1837dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 }
1838dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		struct v4l2_event_subscription sub;
1839dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		sub.type=V4L2_EVENT_ALL;
1840dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
1841dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (ret) {
1842dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Subscribe Event Failed \n");
1843dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		eRet = OMX_ErrorHardware;
1844dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
1845dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 m_state == OMX_StateIdle;
1846dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       }
1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Paused */
1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StatePause)
1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("\n PAUSE Command Issued");
1851dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
1852dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    NULL) < */0)
1853dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         {
1854dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           DEBUG_PRINT_ERROR("\n Error In Pause State");
1855dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           post_event(OMX_EventError,OMX_ErrorHardware,\
1856dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      OMX_COMPONENT_GENERATE_EVENT);
1857dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           eRet = OMX_ErrorHardware;
1858dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         }
1859dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         else
1860dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         {
1861dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1862dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n");
1863dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           bFlag = 0;
1864dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         }
1865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Loaded */
1867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateLoaded)
1868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
1870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_GENERATE_EVENT);
1872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorIncorrectStateTransition;
1873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to WaitForResources */
1875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateWaitForResources)
1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
1878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_GENERATE_EVENT);
1880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorIncorrectStateTransition;
1881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Executing */
1883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateExecuting)
1884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
1886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,OMX_ErrorSameState,\
1887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_GENERATE_EVENT);
1888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorSameState;
1889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Executing to Invalid */
1891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else if(eState == OMX_StateInvalid)
1892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
1894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorInvalidState;
1896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else
1898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
1900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorBadParameter;
1901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is Pause  */
1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StatePause)
1907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to Executing */
1909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateExecuting)
1910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Pause --> Executing \n");
1912dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
1913dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   NULL) < */0)
1914dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
1915dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
1916dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          post_event(OMX_EventError,OMX_ErrorHardware,\
1917dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     OMX_COMPONENT_GENERATE_EVENT);
1918dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          eRet = OMX_ErrorHardware;
1919dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
1920dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        else
1921dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
1922dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
1923dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1924dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          post_event (NULL,VDEC_S_SUCCESS,\
1925dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      OMX_COMPONENT_GENERATE_RESUME_DONE);
1926dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          bFlag = 0;
1927dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
1928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to Idle */
1930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateIdle)
1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Since error is None , we will post an event
1933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        at the end of this function definition */
1934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Pause --> Idle \n");
1935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
1936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(!sem_posted)
1937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           sem_posted = 1;
1939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           sem_post (&m_cmd_lock);
1940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           execute_omx_flush(OMX_ALL);
1941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         bFlag = 0;
1943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to loaded */
1945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateLoaded)
1946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
1948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to WaitForResources */
1953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateWaitForResources)
1954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
1956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
1959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from Pause to Pause */
1961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StatePause)
1962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
1964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,\
1965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
1967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       /* Requesting transition from Pause to Invalid */
1969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateInvalid)
1970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
1972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
1974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
1978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
1979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     /***************************/
1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Current State is WaitForResources  */
1983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /***************************/
1984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateWaitForResources)
1985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Loaded */
1987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eState == OMX_StateLoaded)
1988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Since error is None , we will post an event
1990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        at the end of this function definition */
1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to WaitForResources */
1994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (eState == OMX_StateWaitForResources)
1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
1997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorSameState,
1998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
1999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorSameState;
2000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Executing */
2002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateExecuting)
2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
2007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
2008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Pause */
2010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StatePause)
2011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
2013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
2015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorIncorrectStateTransition;
2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Invalid */
2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(eState == OMX_StateInvalid)
2019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
2021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInvalidState;
2023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Requesting transition from WaitForResources to Loaded -
2025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      is NOT tested by Khronos TS */
2026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
2029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
2031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorBadParameter;
2032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /********************************/
2035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Current State is Invalid */
2036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*******************************/
2037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_state == OMX_StateInvalid)
2038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* State Transition from Inavlid to any state */
2040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
2041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  || OMX_StateIdle || OMX_StateExecuting
2042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  || OMX_StatePause || OMX_StateInvalid))
2043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
2045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_EventError,OMX_ErrorInvalidState,\
2046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_COMPONENT_GENERATE_EVENT);
2047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInvalidState;
2048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (cmd == OMX_CommandFlush)
2051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
2053dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "with param1: %d", param1);
2054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
2057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
2061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!sem_posted){
2063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sem_posted = 1;
2064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Set the Semaphore");
2065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sem_post (&m_cmd_lock);
2066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      execute_omx_flush(param1);
2067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bFlag = 0;
2069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ( cmd == OMX_CommandPortEnable)
2071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
2073dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "with param1: %d", param1);
2074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_inp_bEnabled = OMX_TRUE;
2077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if( (m_state == OMX_StateLoaded &&
2079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            || allocate_input_done())
2081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
2083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EVENT);
2084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
2089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Skip the event notification
2090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bFlag = 0;
2091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Enable output Port command recieved");
2096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_bEnabled = OMX_TRUE;
2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if( (m_state == OMX_StateLoaded &&
2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              || (allocate_output_done()))
2101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
2107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
2110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              // Skip the event notification
2111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFlag = 0;
2112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (cmd == OMX_CommandPortDisable)
2116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
2118dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          "with param1: %d", param1);
2119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_inp_bEnabled = OMX_FALSE;
2122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              && release_input_done())
2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
2131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             {
2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if(!sem_posted)
2134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               {
2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 sem_posted = 1;
2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 sem_post (&m_cmd_lock);
2137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
2138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
2139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
2140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             // Skip the event notification
2142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             bFlag = 0;
2143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_bEnabled = OMX_FALSE;
2148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Disable output Port command recieved");
2149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              && release_output_done())
2151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
2156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
2158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (!sem_posted)
2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
2162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                sem_posted = 1;
2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                sem_post (&m_cmd_lock);
2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
2165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
2166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
2167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Skip the event notification
2169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bFlag = 0;
2170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
2177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorNotImplemented;
2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(eRet == OMX_ErrorNone && bFlag)
2180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
2182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!sem_posted)
2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_post(&m_cmd_lock);
2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ExecuteOmxFlush
2194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Executes the OMX flush.
2197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  flushtype - input flush(1)/output flush(0)/ both.
2200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2207dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
2208dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  enum vdec_bufferflush flush_dir;
2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
2210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (flushType)
2211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_INPUT_PORT_INDEX:
2213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      flush_dir = VDEC_FLUSH_TYPE_INPUT;
2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_OUTPUT_PORT_INDEX:
2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2218dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2223dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      flush_dir = VDEC_FLUSH_TYPE_ALL;
2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2225dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = &flush_dir;
2226dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = NULL;
2227dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < */0)
2228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2229dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
2230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = false;
2231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush
2236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Executes the OMX flush at OUTPUT PORT.
2239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
2242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p1 = 0; // Parameter - 1
2249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p2 = 0; // Parameter - 2
2250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      ident = 0;
2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = true;
2252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Generate FBD for all Buffers in the FTBq*/
2254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Initiate Output Flush");
2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_ftb_q.m_size)
2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       m_ftb_q.m_size,pending_output_buffers);
2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.pop_entry(&p1,&p2,&ident);
2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
2262dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(ident == OMX_COMPONENT_GENERATE_FTB )
2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2264dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      pending_output_buffers++;
2265dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (ident == OMX_COMPONENT_GENERATE_FBD)
2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
2273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_flush_progress = false;
2274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
2276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush
2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Executes the OMX flush at INPUT PORT.
2288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned       i =0;
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p1 = 0; // Parameter - 1
2299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      p2 = 0; // Parameter - 2
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned      ident = 0;
2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = true;
2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Generate EBD for all Buffers in the ETBq*/
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
2305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
2308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_etb_q.m_size)
2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.pop_entry(&p1,&p2,&ident);
2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(ident == OMX_COMPONENT_GENERATE_ETB)
2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_input_buffers++;
2320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (ident == OMX_COMPONENT_GENERATE_EBD)
2325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p1);
2328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  time_stamp_dts.flush_timestamp();
2332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Check if Heap Buffers are to be flushed*/
2333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_scratch.nFilledLen = 0;
2337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_count = 0;
2338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
2339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_count = 0;
2340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
2342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
2343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
2344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Initialize parser");
2345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.mutils)
2346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_frame_parser.mutils->initialize_frame_checking_environment();
2348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (m_input_pending_q.m_size)
2351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_pending_q.pop_entry(&p1,&p2,&ident);
2353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
2354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame)
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
2359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = NULL;
2360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame)
2363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFilledLen = 0;
2365dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
2366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame = NULL;
2367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.flush();
2369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
2371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  input_flush_progress = false;
2372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes)
2373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
2378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
2379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_timestamp_list.reset_ts_list();
2381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SendCommandEvent
2391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Send the event to decoder pipe.  This is needed to generate the callbacks
2394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  in decoder thread context.
2395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
2398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1,
2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          unsigned int p2,
2405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          unsigned int id)
2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet      =                      false;
2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2412dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (id == OMX_COMPONENT_GENERATE_FTB ||
2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      id == OMX_COMPONENT_GENERATE_FBD)
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.insert_entry(p1,p2,id);
2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (id == OMX_COMPONENT_GENERATE_ETB ||
2418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_EBD ||
2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  m_etb_q.insert_entry(p1,p2,id);
2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.insert_entry(p1,p2,id);
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bRet = true;
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  post_message(this, id);
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2439dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE eRet = OMX_ErrorNone;
2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!profileLevelType)
2441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(profileLevelType->nPortIndex == 0) {
2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
2449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (profileLevelType->nProfileIndex == 1)
2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
2455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 2)
2458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
2460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            profileLevelType->nProfileIndex);
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
2470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
2474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
2475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2478dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
2483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2496dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2514dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2521dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetParameter
2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Get Parameter method implementation
2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None if successful.
2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_INDEXTYPE paramIndex,
2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_INOUT OMX_PTR     paramData)
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("get_parameter: \n");
2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(paramData == NULL)
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2558dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  switch(paramIndex)
2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPortDefinition:
2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = update_portdef(portDefn);
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eRet == OMX_ErrorNone)
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_port_def = *portDefn;
2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoInit:
2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PORT_PARAM_TYPE *portParamType =
2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              (OMX_PORT_PARAM_TYPE *) paramData;
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nSize = sizeof(portParamType);
2578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nPorts           = 2;
2579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portParamType->nStartPortNumber = 0;
2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoPortFormat:
2583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
2586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
2587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt->nSize             = sizeof(portFmt);
2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (0 == portFmt->nPortIndex)
2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (0 == portFmt->nIndex)
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->eCompressionFormat = eCompressionFormat;
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              " NoMore compression formats\n");
2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet =  OMX_ErrorNoMore;
2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (1 == portFmt->nPortIndex)
2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(0 == portFmt->nIndex)
2610dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
2611dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  " NoMore Color formats\n");
2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet =  OMX_ErrorNoMore;
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2618dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          (int)portFmt->nPortIndex);
2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Component should support this port definition*/
2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamAudioInit:
2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_PORT_PARAM_TYPE *audioPortParamType =
2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                              (OMX_PORT_PARAM_TYPE *) paramData;
2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nSize = sizeof(audioPortParamType);
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nPorts           = 0;
2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        audioPortParamType->nStartPortNumber = 0;
2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Component should support this port definition*/
2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamImageInit:
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_PORT_PARAM_TYPE *imagePortParamType =
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                              (OMX_PORT_PARAM_TYPE *) paramData;
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nSize = sizeof(imagePortParamType);
2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nPorts           = 0;
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        imagePortParamType->nStartPortNumber = 0;
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Component should support this port definition*/
2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamOtherInit:
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          paramIndex);
2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet =OMX_ErrorUnsupportedIndex;
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamStandardComponentRole:
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_PARAM_COMPONENTROLETYPE *comp_role;
2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        comp_role->nSize = sizeof(*comp_role);
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_MAX_STRINGNAME_SIZE);
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Added for parameter test */
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPriorityMgmt:
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_PRIORITYMGMTTYPE *priorityMgmType =
2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                             (OMX_PRIORITYMGMTTYPE *) paramData;
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            priorityMgmType->nSize = sizeof(priorityMgmType);
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Added for parameter test */
2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamCompBufferSupplier:
2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
2691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bufferSupplierType->nSize = sizeof(bufferSupplierType);
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(0 == bufferSupplierType->nPortIndex)
2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else if (1 == bufferSupplierType->nPortIndex)
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorBadPortIndex;
2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoAvc:
2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoH263:
2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoMpeg4:
2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoMpeg2:
2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              paramIndex);
2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoProfileLevelQuerySupported:
2730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = get_supported_profile_level_for_1080p(profileLevelType);
2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
2741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
2743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(secure_mode) {
2745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
2746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                      GRALLOC_USAGE_PRIVATE_UNCACHED);
2747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                } else {
2748dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
2750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else {
2751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
2752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorBadParameter;
2753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
2761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =OMX_ErrorUnsupportedIndex;
2762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
2767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_width,
2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_height,
2769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.stride,
2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.scan_lines);
2771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((params == NULL) ||
2783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer == NULL) ||
2784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer->handle == NULL) ||
2785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      !m_enable_android_native_buffers)
2786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
2790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
2791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
2792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
2793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer = (OMX_U8*)mmap(0, handle->size,
2794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
2795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(buffer == MAP_FAILED) {
2796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
2797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    return OMX_ErrorInsufficientResources;
2798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
2809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::Setparameter
2810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
2812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Set Parameter method implementation.
2813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
2815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
2816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
2818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if successful.
2819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
2821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_INDEXTYPE paramIndex,
2823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_PTR        paramData)
2824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
2827dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
2829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
2831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(paramData == NULL)
2834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
2837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((m_state != OMX_StateLoaded) &&
2839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
2840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_out_bEnabled == OMX_TRUE) &&
2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
2842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_inp_bEnabled == OMX_TRUE)) {
2843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
2844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2846dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  switch(paramIndex)
2847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPortDefinition:
2849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
2851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
2852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
2853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //been called.
2854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
2855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->format.video.nFrameHeight,
2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->format.video.nFrameWidth);
2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(OMX_DirOutput == portDefn->eDir)
2858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_display_id = portDefn->format.video.pNativeWindow;
2861dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
2862dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size )
2863dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            {
2864dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
2865dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
2866dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              eRet = set_buffer_req(&drv_ctx.op_buf);
2867dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if (eRet == OMX_ErrorNone)
2868dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  m_port_def = *portDefn;
2869dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
2870dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          else
2871dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
2872dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
2873dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
2874dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                portDefn->nBufferCountActual, portDefn->nBufferSize);
2875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorBadParameter;
2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(OMX_DirInput == portDefn->eDir)
2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((portDefn->format.video.xFramerate >> 16) > 0 &&
2881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Frame rate only should be set if this is a "known value" or to
2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // activate ts prediction logic (arbitrary mode only) sending input
2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // timestamps with max value (LLONG_MAX).
2886dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %d",
2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             portDefn->format.video.xFramerate >> 16);
2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          drv_ctx.frame_rate.fps_denominator);
2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!drv_ctx.frame_rate.fps_numerator)
2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = 30;
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(drv_ctx.frame_rate.fps_denominator)
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = (int)
2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_denominator = 1;
2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      drv_ctx.frame_rate.fps_numerator;
2901dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            ioctl_msg.in = &drv_ctx.frame_rate;
2902dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
2903dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                       (void*)&ioctl_msg) < */0)
2904dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            {
2905dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
2906dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            }
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             frm_int, drv_ctx.frame_rate.fps_numerator /
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (float)drv_ctx.frame_rate.fps_denominator);
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(drv_ctx.video_resolution.frame_height !=
2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameHeight ||
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.video_resolution.frame_width  !=
2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameWidth)
2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameWidth,
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameHeight);
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if (portDefn->format.video.nFrameHeight != 0x0 &&
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 portDefn->format.video.nFrameWidth != 0x0)
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             {
2923dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               drv_ctx.video_resolution.frame_height =
2924dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                 drv_ctx.video_resolution.scan_lines =
2925dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                 portDefn->format.video.nFrameHeight;
2926dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               drv_ctx.video_resolution.frame_width =
2927dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                 drv_ctx.video_resolution.stride =
2928dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                 portDefn->format.video.nFrameWidth;
2929dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               ioctl_msg.in = &drv_ctx.video_resolution;
2930dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               ioctl_msg.out = NULL;
2931dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
2932dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                            (void*)&ioctl_msg) < */0)
2933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               {
2934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   DEBUG_PRINT_ERROR("\n Set Resolution failed");
2935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = OMX_ErrorUnsupportedSetting;
2936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
2937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               else
2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = get_buffer_req(&drv_ctx.op_buf);
2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
2942dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
2945dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
2946dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             eRet = set_buffer_req(&drv_ctx.ip_buf);
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2950dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n",
2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->nBufferCountActual, portDefn->nBufferSize);
2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorBadParameter;
2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (portDefn->eDir ==  OMX_DirMax)
2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
2959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (int)portDefn->nPortIndex);
2960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorBadPortIndex;
2961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoPortFormat:
2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
2967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
2968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int ret=0;
2969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      struct v4l2_format fmt;
2970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
2971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->eColorFormat);
2972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(1 == portFmt->nPortIndex)
2974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2975dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2976dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
2977dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
2978dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	fmt.fmt.pix_mp.pixelformat = capture_capability;
2979dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	enum vdec_output_fromat op_format;
2980dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
2981dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  op_format = VDEC_YUV_FORMAT_NV12;
2982dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	else if(portFmt->eColorFormat ==
2983dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
2984dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  op_format = VDEC_YUV_FORMAT_TILE_4x2;
2985dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         else
2986dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	   eRet = OMX_ErrorBadParameter;
2987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2988dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         if(eRet == OMX_ErrorNone)
2989dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         {
2990dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	   drv_ctx.output_format = op_format;
2991dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	   ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
2992dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	   if(ret)
2993dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           {
2994dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             DEBUG_PRINT_ERROR("\n Set output format failed");
2995dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             eRet = OMX_ErrorUnsupportedSetting;
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan			/*TODO: How to handle this case */
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           }
2998dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           else
2999dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	     {
3000dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	       eRet = get_buffer_req(&drv_ctx.op_buf);
3001dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	     }
3002dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 }
3003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexPortDefn:
3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
3010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
3012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            portFmt->nFramePackingFormat);
3013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Input port */
3015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (portFmt->nPortIndex == 0)
3016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
3018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(secure_mode) {
3020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                arbitrary_bytes = false;
3021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
3022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorUnsupportedSetting;
3023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
3024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               arbitrary_bytes = true;
3025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else if (portFmt->nFramePackingFormat ==
3028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               arbitrary_bytes = false;
3031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
3033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3034dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n",
3035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    portFmt->nFramePackingFormat);
3036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorUnsupportedSetting;
3037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
3040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
3042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
3043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
3044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
3045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_mem_region_smi = OMX_TRUE;
3047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_use_output_pmem = OMX_TRUE;
3051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     case OMX_IndexParamStandardComponentRole:
3058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
3059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_PARAM_COMPONENTROLETYPE *comp_role;
3060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
3061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
3062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       comp_role->cRole);
3063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((m_state == OMX_StateLoaded)&&
3065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
3066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("Set Parameter called in valid state");
3068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             return OMX_ErrorIncorrectStateOperation;
3073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
3080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
3092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorUnsupportedSetting;
3097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
3116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
3118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorUnsupportedSetting;
3121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
3124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
3125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  )
3126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
3138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
3139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    )
3140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
3142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
3144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
3154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               eRet = OMX_ErrorInvalidComponentName;
3155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
3157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
3158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamPriorityMgmt:
3160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_state != OMX_StateLoaded)
3162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               return OMX_ErrorIncorrectStateOperation;
3165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
3167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
3168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              priorityMgmtype->nGroupID);
3169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             priorityMgmtype->nGroupPriority);
3172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
3174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamCompBufferSupplier:
3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bufferSupplierType->eBufferSupplier);
3184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             else
3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorBadPortIndex;
3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoAvc:
3195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
3197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoH263:
3201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
3203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoMpeg4:
3207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
3209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoMpeg2:
3213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
3215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       case OMX_QcomIndexParamVideoDecoderPictureOrder:
3219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
3221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
3222dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
3223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
3224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pictureOrder->eOutputPictureOrder);
3225dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
3226dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  pic_order = VDEC_ORDER_DISPLAY;
3227dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
3228dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  pic_order = VDEC_ORDER_DECODE;
3229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  time_stamp_dts.set_timestamp_reorder_mode(false);
3230dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              }
3231dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              else
3232dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  eRet = OMX_ErrorBadParameter;
3233dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
3234dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
3235dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              {
3236dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  drv_ctx.picture_order = pic_order;
3237dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		  // ioctl_msg.in = &drv_ctx.picture_order;
3238dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  //ioctl_msg.out = NULL;
3239dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3240dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      (void*)&ioctl_msg) < */0)
3241dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  {
3242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      DEBUG_PRINT_ERROR("\n Set picture order failed");
3243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      eRet = OMX_ErrorUnsupportedSetting;
3244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  }
3245dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              }
3246dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              break;
3247dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamConcealMBMapExtraData:
3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3250dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
3260dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
3261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
3263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       break;
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamInterlaceExtraData:
3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3270dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamH264TimeInfo:
3278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3279dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
3280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoDivx:
3287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
3289dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
3290dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#if 0
3291dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         createDivxDrmContext( divXType->pDrmHandle );
3292dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
3293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexPlatformPvt:
3296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
3298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
3299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
3300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
3302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_pvt_entry_pmem = OMX_TRUE;
3307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
3310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_use_output_pmem = OMX_TRUE;
3311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
3317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3318dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
3319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
3320dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          drv_ctx.idr_only_decoding = 1;
3321dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          int rc; //= ioctl(drv_ctx.video_driver_fd,
3322dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               //       VDEC_IOCTL_SET_IDR_ONLY_DECODING);
3323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(rc < 0) {
3324dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
3325dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              eRet = OMX_ErrorHardware;
3326dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
3327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamIndexExtraDataType:
3331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
3333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
3334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
3335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->bEnabled == OMX_TRUE) &&
3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->nPortIndex == 1))
3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
3339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
3340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              // Set smooth streaming parameter
3341dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              int rc;// = ioctl(drv_ctx.video_driver_fd,
3342dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   //         VDEC_IOCTL_SET_CONT_ON_RECONFIG);
3343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              if(rc < 0) {
3344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3345dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  eRet = OMX_ErrorHardware;
3346dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              }
3347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
3350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3351dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
3352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Need to allow following two set_parameters even in Idle
3354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * state. This is ANDROID architecture which is not in sync
3355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * with openmax standard. */
3356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
3357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
3359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(enableNativeBuffers) {
3360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_enable_android_native_buffers = enableNativeBuffers->enable;
3361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
3365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = use_android_native_buffer(hComp, paramData);
3367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamEnableTimeStampReorder:
3371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
3373dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) {
3374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE) {
3375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              frm_int =0;
3376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              time_stamp_dts.set_timestamp_reorder_mode(true);
3377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            time_stamp_dts.set_timestamp_reorder_mode(false);
3380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          time_stamp_dts.set_timestamp_reorder_mode(false);
3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE)
3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
3390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
3392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorUnsupportedIndex;
3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
3396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetConfig
3401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Get Config Method implementation.
3404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if successful.
3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_IN OMX_INDEXTYPE configIndex,
3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_INOUT OMX_PTR     configData)
3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_state == OMX_StateInvalid)
3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorInvalidState;
3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3424dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  switch (configIndex)
3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexConfigInterlaced:
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (configFmt->nPortIndex == 1)
3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (configFmt->nIndex == 0)
3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (configFmt->nIndex == 1)
3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          configFmt->eInterlaceType =
3439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (configFmt->nIndex == 2)
3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          configFmt->eInterlaceType =
3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            " NoMore Interlaced formats\n");
3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorNoMore;
3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (int)configFmt->nPortIndex);
3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3464dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
3467dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        //ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
3468dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        //(void)(ioctl(drv_ctx.video_driver_fd,
3469dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               //VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
3470dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	decoderinstances->nNumOfInstances = 16;
347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan	/*TODO: How to handle this case */
3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_QcomIndexConfigVideoFramePackingArrangement:
3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_pack_data(configFmt);
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorBadParameter;
3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SetConfig
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Set Config method implementation
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if successful.
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_IN OMX_INDEXTYPE configIndex,
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        OMX_IN OMX_PTR        configData)
3516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInvalidState;
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_VIDEO_CONFIG_NALSIZE *pNal;
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Set Config Called");
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_state == OMX_StateExecuting)
3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return ret;
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3534dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (configIndex == OMX_IndexVendorVideoExtraData)
3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
3537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 extra_size;
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Parsing done here for the AVC atom is definitely not generic
3543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Currently this piece of code is working, but certainly
3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // not tested with all .mp4 files.
3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Incase of failure, we might need to revisit this
3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // for a generic piece of code.
3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Retrieve size of NAL length field
3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // byte #4 contains the size of NAL lenght field
3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nal_length = (config->pData[4] & 0x03) + 1;
3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_size = 0;
3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (nal_length > 2)
3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        extra_size = (nal_length - 2) * 2;
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // SPS starts from byte #6
3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
3561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U8 *pDestBuf;
3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nPortIndex = config->nPortIndex;
3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // minus 6 --> SPS starts from byte #6
3565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // minus 1 --> picture param set byte to be ignored from avcatom
3566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
3567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
3568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 len;
3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U8 index = 0;
3570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // case where SPS+PPS is sent as part of set_config
3571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pDestBuf = m_vendor_config.pData;
3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
3574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_vendor_config.nPortIndex,
3575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_vendor_config.nDataSize,
3576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_vendor_config.pData);
3577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      while (index < 2)
3578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        uint8 *psize;
3580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len = *pSrcBuf;
3581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len = len << 8;
3582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len |= *(pSrcBuf + 1);
3583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psize = (uint8 *) & len;
3584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
3585dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        for (int i = 0; i < nal_length; i++)
3586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pDestBuf[i] = psize[nal_length - 1 - i];
3588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //memcpy(pDestBuf,pSrcBuf,(len+2));
3590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pDestBuf += len + nal_length;
3591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pSrcBuf += len + 2;
3592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index++;
3593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pSrcBuf++;   // skip picture param set
3594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        len = 0;
3595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
3598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
3599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nPortIndex = config->nPortIndex;
3601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.nDataSize = config->nDataSize;
3602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
3603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
3604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
3606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_vendor_config.pData)
3608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free(m_vendor_config.pData);
3610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData = NULL;
3611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = 0;
3612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (((*((OMX_U32 *) config->pData)) &
3615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             VC1_SP_MP_START_CODE_MASK) ==
3616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             VC1_SP_MP_START_CODE)
3617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
3619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
3621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData =
3622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_U8 *) malloc(config->nDataSize);
3623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy(m_vendor_config.pData, config->pData,
3624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   config->nDataSize);
3625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vc1_profile = VC1_SP_MP_RCV;
3626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
3628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
3630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
3632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData =
3633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_U8 *) malloc((config->nDataSize));
3634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy(m_vendor_config.pData, config->pData,
3635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   config->nDataSize);
3636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vc1_profile = VC1_AP;
3637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
3639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
3641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize  = config->nDataSize;
3643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
3644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
3645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vc1_profile = VC1_SP_MP_RCV;
3646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
3650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return ret;
3653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (configIndex == OMX_IndexConfigVideoNalSize)
3655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
3658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_length = pNal->nNaluBytes;
3659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_nal_length(nal_length);
3660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
3661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return ret;
3662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
3665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetExtensionIndex
3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX GetExtensionIndex method implementaion.  <TBD>
3673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
3679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
3682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_IN OMX_STRING      paramName,
3683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_OUT OMX_INDEXTYPE* indexType)
3684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
3686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
3688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
3689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
3692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
3694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
3700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
3703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
3705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
3706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
3707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
3713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
3714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::GetState
3722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns the state information back to the caller.<TBD>
3725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None if everything is successful.
3731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
3733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       OMX_OUT OMX_STATETYPE* state)
3734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  *state = m_state;
3736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
3738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentTunnelRequest
3743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Component Tunnel Request method implementation. <TBD>
3746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
3749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
3752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
3755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_IN OMX_U32                        port,
3756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
3757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_IN OMX_U32                    peerPort,
3758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
3761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
3762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseOutputBuffer
3767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Helper function for Use buffer in the input pin
3770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
3773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
3776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
3779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
3780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
3781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
3782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes,
3784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U8*                   buffer)
3785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
3788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned                         i= 0; // Temporary counter
3789dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
3791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PTR privateAppData = NULL;
3792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  private_handle_t *handle = NULL;
3793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buff = buffer;
3794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr) {
3795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
3796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_output_headers();
3797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
3800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
3801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_out_bm_count,i))
3802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
3804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i >= drv_ctx.op_buf.actualcount) {
3809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
3810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
3813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
3814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
3815dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(m_use_android_native_buffers) {
3816dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
3817dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           sp<android_native_buffer_t> nBuf = params->nativeBuffer;
3818dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           handle = (private_handle_t *)nBuf->handle;
3819dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           privateAppData = params->pAppPrivate;
3820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3821dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        else {
3822dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           handle = (private_handle_t *)buff;
3823dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           if(!secure_mode) {
3824dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	       buff =  (OMX_U8*)mmap(0, handle->size,
3825dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                             PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
3826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               if (buff == MAP_FAILED) {
3827dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
3828dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   return OMX_ErrorInsufficientResources;
3829dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               }
3830dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	    }
3831dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           privateAppData = appData;
3832dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
3833dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(!handle) {
3834dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
3838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
3839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
3841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else
3843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!ouput_egl_buffers && !m_use_output_pmem) {
3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
3848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
3849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
3850dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                &drv_ctx.op_buf_ion_info[i].fd_ion_data, 0);
3851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
3852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
3856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          open (MEM_DEVICE,O_RDWR);
3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
3862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
3865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            open (MEM_DEVICE,O_RDWR);
3868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
3869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
3870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
3874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size,
3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.alignment))
3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
3880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
3883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].bufferaddr =
3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              PROT_READ|PROT_WRITE, MAP_SHARED,
3886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
3891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return OMX_ErrorInsufficientResources;
3893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
3898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
3901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!appData || !bytes ) {
3902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!secure_mode && !buffer) {
3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return OMX_ErrorBadParameter;
3905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
3909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
3910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
3911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
3912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            !pmem_list->nEntries ||
3913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
3914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
3915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
3916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
3918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pmem_list->entryList->entry;
3919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          pmem_info->pmem_fd);
3921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
3922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
3924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
3925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
3927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
3928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
3929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
3930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     *bufferHdr = (m_out_mem_ptr + i );
3932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(secure_mode)
3933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
3934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
3936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             sizeof (vdec_bufferpayload));
3937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3938dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     //     ioctl_msg.in  = &setbuffers;
3939dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     //     ioctl_msg.out = NULL;
3940dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
3941dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
3942dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                       drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
3943dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     // if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
3944dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     //      &ioctl_msg) < 0)
3945dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     //  {
3946dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     //  DEBUG_PRINT_ERROR("\n Set output buffer failed");
3947dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     //   return OMX_ErrorInsufficientResources;
3948dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     //  }
3949dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     // found an empty buffer at i
3950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
3951dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     (*bufferHdr)->pBuffer = buff;
3952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->pAppPrivate = privateAppData;
3953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     BITMASK_SET(&m_out_bm_count,i);
3954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
3956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
3959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
3960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::use_input_heap_buffers
3961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
3963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use Buffer Heap allocation method implementation.
3964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
3966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
3967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
3969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None , if everything successful.
3970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
3972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
3973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
3974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
3975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
3976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
3977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes,
3978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U8*                   buffer)
3979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
3981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr)
3983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
3984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
3985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
3986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_phdr_pmem_ptr)
3987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
3989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
3990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
3991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficent memory");
3993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
3994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = true;
3998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
3999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
4006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
4007dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL))
4008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_in_alloc_cnt++;
4013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseBuffer
4025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use Buffer method implementation.
4028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
4031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None , if everything successful.
4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_buffer(
4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
4040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
4041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes,
4042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U8*                   buffer)
4043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE error = OMX_ErrorNone;
4045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4046dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
40476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || bytes == 0)
4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode && buffer == NULL) {
4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
4052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
4053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
4058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInvalidState;
4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == OMX_CORE_INPUT_PORT_INDEX)
4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
4062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
4064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
4067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = OMX_ErrorBadPortIndex;
4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
4070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(error == OMX_ErrorNone)
4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Send the callback now
4075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandStateSet,OMX_StateIdle,
4077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_EVENT);
4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
4081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_CORE_INPUT_PORT_INDEX,
4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_COMPONENT_GENERATE_EVENT);
4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
4088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_CORE_OUTPUT_PORT_INDEX,
4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_COMPONENT_GENERATE_EVENT);
4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return error;
4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
4100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_heap_ptr[bufferindex].pBuffer)
4105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free(m_inp_heap_ptr[bufferindex].pBuffer);
4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
4107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (pmem_bufferHdr)
4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer(pmem_bufferHdr);
4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int index = 0;
4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
4117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  index = bufferHdr - m_inp_mem_ptr;
4122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
4125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
4128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4129dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       struct vdec_setbuffer_cmd setbuffers;
4131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
4133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sizeof (vdec_bufferpayload));
4134dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       ioctl_msg.in  = &setbuffers;
4135dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       ioctl_msg.out = NULL;
4136dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       int ioctl_r; //= ioctl (drv_ctx.video_driver_fd,
4137dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           //                 VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
4138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       if (ioctl_r < 0)
4139dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       {
4140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
4141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       }
4142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
4143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
4144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].pmem_fd);
4145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
4146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].mmaped_size,
4147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].bufferaddr);
4148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
4149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ptr_inputbuffer[index].mmaped_size);
4150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
4151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
4152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
4153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_desc_buffer_ptr[index].buf_addr);
4155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].buf_addr = NULL;
4156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].desc_data_size = 0;
4157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int index = 0;
4170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  index = bufferHdr - m_out_mem_ptr;
4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.op_buf.actualcount
4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && drv_ctx.ptr_outputbuffer)
4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4185dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_setbuffer_cmd setbuffers;
4187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        sizeof (vdec_bufferpayload));
4190dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.in  = &setbuffers;
4191dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.out = NULL;
4192dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\nRelease the Output Buffer");
4193dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
4194dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          &ioctl_msg) < */0)
4195dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
4196dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
4199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
4201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[index].mmaped_size);
4202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
4207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
4209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[0].pmem_fd);
4210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
4211dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    drv_ctx.ptr_outputbuffer[0].mmaped_size,
4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[0].bufferaddr);
4213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
4214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    drv_ctx.ptr_outputbuffer[0].mmaped_size);
4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
4217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_BUFFERHEADERTYPE **bufferHdr,
4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_U32              port,
4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_PTR              appData,
4234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_U32              bytes)
4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *input = NULL;
4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char *buf_addr = NULL;
4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned   i = 0;
4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Sanity Check*/
4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL)
4243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_heap_ptr == NULL)
4248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
4253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_heap_ptr == NULL)
4257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
4259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Find a Free index*/
4264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
4267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
4270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.ip_buf.actualcount)
4274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buf_addr == NULL)
4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_inp_heap_ptr + i);
4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input = *bufferHdr;
4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    BITMASK_SET(&m_heap_inp_bm_count,i);
4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pBuffer           = (OMX_U8 *)buf_addr;
4287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nVersion.nVersion = OMX_SPEC_VERSION;
4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pAppPrivate       = appData;
4291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
4293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
4294dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] );
4295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Add the Buffers to freeq*/
4296dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL))
4297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateInputBuffer
4315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Helper function for allocate buffer in the input pin
4318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
4321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
4327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
4328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes)
4332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *input = NULL;
4337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned   i = 0;
4339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char *buf_addr = NULL;
4340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int pmem_fd = -1;
4341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bytes != drv_ctx.ip_buf.buffer_size)
4343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
4345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes, drv_ctx.ip_buf.buffer_size);
4346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
4347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_mem_ptr)
4350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
4352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.actualcount,
4353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.buffer_size);
4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_mem_ptr == NULL)
4359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
4364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer == NULL)
4367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
4372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info == NULL)
4375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(BITMASK_ABSENT(&m_inp_bm_count,i))
4392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
4395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i < drv_ctx.ip_buf.actualcount)
4399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct v4l2_buffer buf;
4401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct v4l2_plane plane;
4402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int rc;
4403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate input Buffer");
4404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
4407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
4408dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		    &drv_ctx.ip_buf_ion_info[i].fd_ion_data, 0);
4409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
4410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd < 0)
4417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd == 0)
4423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
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
4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
4434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.alignment))
4435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(pmem_fd);
4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buf_addr = (unsigned char *)mmap(NULL,
4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ip_buf.buffer_size,
4444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buf_addr == MAP_FAILED)
4447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            close(pmem_fd);
4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
4453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_inp_mem_ptr + i);
4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
4462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].offset = 0;
4465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.index = i;
4468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.memory = V4L2_MEMORY_USERPTR;
4470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.bytesused = 0;
4471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
4473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.reserved[1] = 0;
4475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
4476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.m.planes = &plane;
4477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf.length = 1;
4478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
4480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
44826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (rc) {
4484dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       printf("Failed to prepare bufs\n");
448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan	   /*TODO: How to handle this case */
4486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorInsufficientResources;
4487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input = *bufferHdr;
4490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    BITMASK_SET(&m_inp_bm_count,i);
4491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
4492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
4494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer           = (OMX_U8 *)buf_addr;
4496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nVersion.nVersion = OMX_SPEC_VERSION;
4498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pAppPrivate       = appData;
4500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
4502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.disable_dmx)
4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = allocate_desc_buffer(i);
4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
4511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateOutputBuffer
4520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Helper fn for AllocateBuffer in the output pin
4523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
4526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything went well.
4529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
4532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE            hComp,
4533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   port,
4535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_PTR                   appData,
4536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_U32                   bytes)
4537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
4540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned                         i= 0; // Temporary counter
4541dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_device_fd =-1;
4545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_allocation_data ion_alloc_data;
4546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_fd_data fd_ion_data;
4547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_out_mem_ptr)
4549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
4551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount,
4552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size);
4553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nBufHdrSize        = 0;
4554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformEntrySize = 0;
4555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformListSize  = 0;
4556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPMEMInfoSize = 0;
4557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int pmem_fd = -1;
4558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned char *pmem_baseaddress = NULL;
4559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
4561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
4562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
4563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
4565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
4567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
4568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
4570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
4571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
4572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
4573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
4574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
4575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
4577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE),
4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPMEMInfoSize,
4579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPlatformListSize);
4580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
4581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         drv_ctx.op_buf.actualcount);
4582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_device_fd = alloc_map_ion_memory(
4584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
4585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.op_buf.alignment,
4586dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    &ion_alloc_data, &fd_ion_data, 0);
4587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ion_device_fd < 0) {
4588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = fd_ion_data.fd;
4591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd < 0)
4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf.buffer_size);
4598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(pmem_fd == 0)
4602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
4604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pmem_fd < 0)
4606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
4608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size);
4609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
4614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount,
4615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.alignment))
4616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(pmem_fd);
4619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!secure_mode) {
4623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_baseaddress = (unsigned char *)mmap(NULL,
4624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           (drv_ctx.op_buf.buffer_size *
4625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.op_buf.actualcount),
4626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
4627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pmem_baseaddress == MAP_FAILED)
4628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
4630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size);
4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(pmem_fd);
4632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
4639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Alloc mem for platform specific info
4640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *pPtr=NULL;
4641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
4642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     nPMEMInfoSize,1);
4643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
4644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
4645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
4647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
4648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
4651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),
4652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
4656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer)
4657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_outputbuffer[0].mmaped_size =
4659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (drv_ctx.op_buf.buffer_size *
4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         drv_ctx.op_buf.actualcount);
4661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufHdr          =  m_out_mem_ptr;
4662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
4663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_list)  + nPlatformListSize);
4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_entry) + nPlatformEntrySize);
4667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList   = m_platform_list;
4668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry  = m_platform_entry;
4669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo       = m_pmem_info;
4670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
4672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Settting the entire storage nicely
4674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
4675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
4677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
4680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Set the values when we determine the right HxW param
4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = bytes;
4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nFilledLen         = 0;
4683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = appData;
4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Platform specific PMEM Information
4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform Entry
4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
4689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->entry      = pPMEMInfo;
4690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform List
4691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->nEntries    = 1;
4692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->entryList   = pPlatformEntry;
4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep pBuffer NULL till vdec is opened
4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pBuffer            = NULL;
4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOffset            = 0;
4696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
4698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->pmem_fd = 0;
4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pPlatformPrivate = pPlatformList;
4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
4704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
4705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
4706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Create a mapping between buffers*/
4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
4711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
4712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr =
4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].bufferaddr);
4719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Move the buffer and buffer header pointers
4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr++;
4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo++;
4722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry++;
4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList++;
4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4728dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        m_out_mem_ptr, pPtr);
4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_out_mem_ptr)
4731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_out_mem_ptr);
4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_out_mem_ptr = NULL;
4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPtr)
4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPtr);
4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPtr = NULL;
4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
4748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
4749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
4752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
4753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =  OMX_ErrorInsufficientResources;
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.op_buf.actualcount; i++)
4762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(BITMASK_ABSENT(&m_out_bm_count,i))
4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
4766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone)
4771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(i < drv_ctx.op_buf.actualcount)
4773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      struct v4l2_buffer buf;
4775dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      struct v4l2_plane plane;
4776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int rc;
4777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_outputbuffer[i].buffer_len =
4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf.buffer_size;
4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_out_mem_ptr + i );
4783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode) {
4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.index = i;
4789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
4790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.memory = V4L2_MEMORY_USERPTR;
4791dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.length = drv_ctx.op_buf.buffer_size;
4792dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[i].bufferaddr-drv_ctx.ptr_outputbuffer[i].offset);
4793b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION
4794dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
4795b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif
4796dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
4797dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.data_offset = 0;
4798dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.m.planes = &plane;
4799dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.length = 1;
4800dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
4801dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
4802dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
4803dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (rc) {
480461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		/*TODO: How to handle this case */
4805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorInsufficientResources;
4806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
4809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		enum v4l2_buf_type buf_type;
4810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
4811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
4812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (rc) {
4813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			return OMX_ErrorInsufficientResources;
4814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else {
4815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			streaming[CAPTURE_PORT] = true;
4816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
4817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
4818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  }
4819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
4821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (*bufferHdr)->pAppPrivate = appData;
4822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_SET(&m_out_bm_count,i);
4823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInsufficientResources;
4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer  -- API Call
4836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateBuffer
4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns zero if all the buffers released..
4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
4848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
4851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_IN OMX_U32                        port,
4853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_IN OMX_PTR                     appData,
4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     OMX_IN OMX_U32                       bytes)
4855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned i = 0;
4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateInvalid)
4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
4863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
4864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX)
4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (arbitrary_bytes)
4869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
4875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4879dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
4884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorBadPortIndex;
4885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
4887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eRet == OMX_ErrorNone)
4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(allocate_done()){
4890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
4891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
4893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandStateSet,OMX_StateIdle,
4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_GENERATE_EVENT);
4896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             post_event(OMX_CommandPortEnable,
4904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_CORE_INPUT_PORT_INDEX,
4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
4906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
4909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
4911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
4912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortEnable,
4914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_CORE_OUTPUT_PORT_INDEX,
4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_COMPONENT_GENERATE_EVENT);
4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call
4924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
4925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
4926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::FreeBuffer
4927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
4929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
4931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
4932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
4934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
4935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
4938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_U32                 port,
4939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int nPortIndex;
4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("In for decoder free_buffer \n");
4944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_state == OMX_StateIdle &&
4946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
4947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
4949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
4951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
4952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4953dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
4954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
4956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
4958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
4959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_ErrorPortUnpopulated,
4960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
4961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
4963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (m_state != OMX_StateInvalid)
4965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
4967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
4968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_ErrorPortUnpopulated,
4969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_COMPONENT_GENERATE_EVENT);
4970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX)
4973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /*Check if arbitrary bytes*/
4975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!arbitrary_bytes && !input_use_buffer)
4976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - m_inp_mem_ptr;
4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
4978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - m_inp_heap_ptr;
4979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
4981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.ip_buf.actualcount)
4982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // Clear the bit associated with it.
4984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
4985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
4986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (input_use_buffer == true)
4987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
4988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
4990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_phdr_pmem_ptr)
4991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
4992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
4993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
4994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
4995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (arbitrary_bytes)
4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(m_phdr_pmem_ptr)
4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
4999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
5000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,NULL);
5001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
5002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
5003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_input_buffer(buffer);
5004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_inp_bPopulated = OMX_FALSE;
5006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /*Free the Buffer Header*/
5007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (release_input_done())
5008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
5009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
5010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer_header();
5011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
5012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
5014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
5016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
5017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           && release_input_done())
5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
5024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandPortDisable,
5025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_CORE_INPUT_PORT_INDEX,
5026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EVENT);
5027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // check if the buffer is valid
5032dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr;
5033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.op_buf.actualcount)
5034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
5036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Clear the bit associated with it.
5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_bPopulated = OMX_FALSE;
5039dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            free_output_buffer (buffer);
5040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (release_output_done())
5042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_output_buffer_header();
5044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
5045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
5047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
5049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           && release_output_done())
5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
5055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
5058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortDisable,
5060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_CORE_OUTPUT_PORT_INDEX,
5061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_COMPONENT_GENERATE_EVENT);
5062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((eRet == OMX_ErrorNone) &&
5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(release_done())
5072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Send the callback now
5074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
5075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandStateSet, OMX_StateLoaded,
5076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_COMPONENT_GENERATE_EVENT);
5077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
5080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::EmptyThisBuffer
5086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This routine is used to push the encoded video frames to
5089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  the video decoder.
5090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything went successful.
5096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
5102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
5103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
5105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
5107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInvalidState;
5108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer == NULL)
5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_inp_bEnabled)
5117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
5123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5124dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex);
5125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(iDivXDrmDecrypt)
5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drmErr != OMX_ErrorNone) {
5133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // this error can be ignored
5134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
5135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
5139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!latency)
5141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.stop();
5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      latency = dec_time.processing_time_us();
5144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.start();
5145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
5149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufferIndex = buffer - m_inp_heap_ptr;
5151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (input_use_buffer == true)
5155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
5156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_heap_ptr;
5157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
5158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
5159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
5160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       buffer = &m_inp_mem_ptr[nBufferIndex];
5161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
5162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
5163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else{
5165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_mem_ptr;
5166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
5170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
5172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
5176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
5177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
5178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned)hComp,(unsigned)buffer,
5180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
5181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
5185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(buffer->nTimeStamp);
5186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
5187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::empty_this_buffer_proxy
5194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This routine is used to push the encoded video frames to
5197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  the video decoder.
5198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything went successful.
5204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
5207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int push_cnt = 0,i=0;
5210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned nPortIndex = 0;
5211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
5212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_input_frameinfo frameinfo;
5213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_bufferpayload *temp_buffer;
5214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg;
5215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_seqheader seq_header;
5216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool port_setting_changed = true;
5217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool not_coded_vop = false;
5218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Should we generate a Aync error event*/
5220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
5221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
5223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
5227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nPortIndex > drv_ctx.ip_buf.actualcount)
5229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
5231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex);
5232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_input_buffers++;
5236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
5238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
5239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
5240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer");
5242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
5244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
5245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
5249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4StreamType psBits;
5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
5251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.numBytes = buffer->nFilledLen;
5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4_headerparser.parseHeader(&psBits);
5253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    not_coded_vop = mp4_headerparser.is_notcodec_vop(
5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(not_coded_vop) {
5256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_HIGH("\n Found Not coded vop len %d frame number %d",
5257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             buffer->nFilledLen,frame_count);
5258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
5260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          not_coded_vop = false;
5261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          buffer->nFilledLen = 0;
5262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(input_flush_progress == true
5267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     || not_coded_vop
5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     )
5271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
5273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
5275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
5276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
5279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
5281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
5286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*for use buffer we need to memcpy the data*/
5287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  temp_buffer->buffer_len = buffer->nFilledLen;
5288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (input_use_buffer)
5290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFilledLen <= temp_buffer->buffer_len)
5292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(arbitrary_bytes)
5294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
5298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
5300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->nFilledLen);
5301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
5306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.bufferaddr = temp_buffer->bufferaddr;
5311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.client_data = (void *) buffer;
5312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.datalen = temp_buffer->buffer_len;
5313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.flags = 0;
5314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.offset = buffer->nOffset;
5315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.pmem_fd = temp_buffer->pmem_fd;
5316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.pmem_offset = temp_buffer->offset;
5317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frameinfo.timestamp = buffer->nTimeStamp;
5318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
5319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: dmx enabled");
5321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_demux_entries == 0)
5322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extract_demux_addr_offsets(buffer);
5324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5326dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
5327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    handle_demux_data(buffer);
5328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
5329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
5330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = NULL;
5334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = 0;
5335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!arbitrary_bytes)
5337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frameinfo.flags |= buffer->nFlags;
5339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
5343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(arbitrary_bytes)
5345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
5350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (inputBufferFile1)
5359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite((const char *)temp_buffer->bufferaddr,
5361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      temp_buffer->buffer_len,1,inputBufferFile1);
5362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
5366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
5372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
5374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_scratch.nFilledLen = 0;
5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_count = 0;
5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_count = 0;
5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.mutils)
5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_frame_parser.mutils->initialize_frame_checking_environment();
5381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.flush();
5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
5384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5387dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    struct v4l2_buffer buf = {0};
5388dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	struct v4l2_plane plane;
5389dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc;
5390dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	unsigned long  print_count;
5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {  buf.flags = V4L2_BUF_FLAG_EOS;
5393dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  printf("\n  INPUT EOS reached \n") ;
5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	OMX_ERRORTYPE eRet = OMX_ErrorNone;
5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.index = nPortIndex;
5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.memory = V4L2_MEMORY_USERPTR;
5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.bytesused = temp_buffer->buffer_len;
5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.length = drv_ctx.ip_buf.buffer_size;
5401dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	plane.m.userptr = (unsigned long)(temp_buffer->bufferaddr-temp_buffer->offset);
5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.reserved[0] = temp_buffer->pmem_fd;
5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.reserved[1] = temp_buffer->offset;
5404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	plane.data_offset = 0;
5405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.m.planes = &plane;
5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf.length = 1;
5407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
5408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!streaming[OUTPUT_PORT])
5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum v4l2_buf_type buf_type;
5411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int ret,r;
5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(!ret) {
5416dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Streamon on OUTPUT Plane was successful \n");
5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		streaming[OUTPUT_PORT] = true;
5418dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ret = pthread_create(&async_thread_id,0,async_message_thread,this);
5419dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if(ret < 0)
5420dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("\n Failed to create async_message_thread \n");
5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	} else{
542261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		/*TODO: How to handle this case */
5423dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf(" \n Failed to call streamon on OUTPUT \n");
5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      time_stamp_dts.insert_timestamp(buffer);
5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::FillThisBuffer
5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  IL client uses this method to release the frame buffer
5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  after displaying them.
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
5453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInvalidState;
5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_bEnabled)
5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5464dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (buffer == NULL || ((buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount))
5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
5472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
5476dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  post_event((unsigned) hComp, (unsigned)buffer,OMX_COMPONENT_GENERATE_FTB);
5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::fill_this_buffer_proxy
5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  IL client uses this method to release the frame buffer
5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  after displaying them.
5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
5492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_HANDLETYPE        hComp,
5496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE nRet = OMX_ErrorNone;
5499dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
5500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned nPortIndex = 0;
5502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_fillbuffer_cmd fillbuffer;
5503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
5505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5506dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_out_mem_ptr);
5507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5508dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (bufferAdd == NULL || ((buffer - m_out_mem_ptr) >
5509dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      drv_ctx.op_buf.actualcount) )
5510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
5513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufferAdd, bufferAdd->pBuffer);
5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*Return back the output buffer to client*/
5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
5518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_output_buffers++;
5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
5524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ptr_respbuffer)
5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer->nFilledLen = 0;
5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.FillBufferDone (hComp,m_app_data,buffer);
5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_output_buffers--;
5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5538dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand // memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sizeof(struct vdec_bufferpayload));
5540dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand // fillbuffer.client_data = bufferAdd;
5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc = 0;
5543dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	struct v4l2_buffer buf={0};
5544dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	struct v4l2_plane plane;
5545dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
5546dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	buf.index = nPortIndex;
5547dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
5548dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	buf.memory = V4L2_MEMORY_USERPTR;
5549dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	plane.bytesused = buffer->nFilledLen;
5550dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	plane.length = drv_ctx.op_buf.buffer_size;
5551dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr-drv_ctx.ptr_outputbuffer[nPortIndex].offset);
5552dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	plane.reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
5553dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	plane.reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
5554dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	plane.data_offset = 0;
5555dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	buf.m.planes = &plane;
5556dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	buf.length = 1;
555761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5558dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
5559dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (rc) {
5560dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		/*TODO: How to handle this case */
5561dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to qbuf to driver");
5562dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //m_cb.FillBufferDone (hComp,m_app_data,buffer);
5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // pending_output_buffers--;
5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // return OMX_ErrorBadParameter;
5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //}
5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::SetCallbacks
5573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Set the callbacks.
5576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
5582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
5585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
5586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_IN OMX_PTR             appData)
5587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_cb       = *callbacks;
5590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
5591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               m_cb.EventHandler,m_cb.FillBufferDone);
5592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_app_data =    appData;
5593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
5594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentDeInit
5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Destroys the component and release memory allocated to the heap.
5602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
5605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything successful.
5608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(iDivXDrmDecrypt)
5614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5620dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    int i = 0;
5621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (OMX_StateLoaded != m_state)
5622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
5624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          m_state);
5625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
5626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
5630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the output buffers have to be cleaned up*/
5633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr)
5634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Freeing the Output Memory\n");
5636dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        for (i=0; i < drv_ctx.op_buf.actualcount; i++ )
5637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free_output_buffer (&m_out_mem_ptr[i]);
5639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the input buffers have to be cleaned up*/
5643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_mem_ptr || m_inp_heap_ptr)
5644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Freeing the Input Memory\n");
5646dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        for (i=0; i<drv_ctx.ip_buf.actualcount; i++ )
5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_inp_mem_ptr)
5649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,&m_inp_mem_ptr[i]);
5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,NULL);
5652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(h264_scratch.pBuffer)
5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
5663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
5665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	h264_parser = NULL;
5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_platform_list)
5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_platform_list);
5671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_platform_list = NULL;
5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_vendor_config.pData)
5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_vendor_config.pData);
5676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_vendor_config.pData = NULL;
5677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Reset counters in mesg queues
5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_size=0;
5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_size=0;
5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_size=0;
5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_read = m_ftb_q.m_write =0;
5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_read = m_cmd_q.m_write =0;
5685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_read = m_etb_q.m_write =0;
5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_debug_timestamp)
5688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.reset_ts_list();
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
5694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       // NULL);
5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Close the driver instance");
56976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
5700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
5702dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    fclose (outputBufferFile1);
5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
5705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
5706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
5708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
5709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseEGLImage
5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use EGL Image method implementation <TBD>.
5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
5720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Not Implemented error.
5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN OMX_U32                        port,
5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN OMX_PTR                     appData,
5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_IN void*                      eglImage)
5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
5732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
5734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
5736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
5737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   EGLint fd = -1, offset = 0,pmemPtr = 0;
5738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
5739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int fd = -1, offset = 0;
5740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
5742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
5743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("\n ");
5744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
5746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_display_id == NULL) {
5747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
5748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
5749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
5751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    eglGetProcAddress("eglQueryImageKHR");
5752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
5753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
5754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
5755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
5756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
5757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
5759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
5761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
5762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (temp_egl_id != NULL)
5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
5770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.pmem_fd = (OMX_U32) fd;
5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.offset = (OMX_U32) offset;
5775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.entry = (void *) &pmem_info;
5776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.entryList = &pmem_entry;
5778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.nEntries = 1;
5779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ouput_egl_buffers = true;
5780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
5781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_U8 *)pmemPtr)) {
5783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
5784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorInsufficientResources;
5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return OMX_ErrorNone;
5787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ComponentRoleEnum
5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Component Role Enum method implementation.
5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None if everything is successful.
5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
5803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_OUT OMX_U8*        role,
5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                OMX_IN OMX_U32        index)
5805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
5813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
5847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
5848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          )
5849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
5854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
5863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
5867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
5876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
5877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           )
5878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
5880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
5882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
5883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
5887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
5893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInvalidComponentName;
5894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
5896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateDone
5904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if entire buffer pool is allocated by IL Client or not.
5907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Need this to move to IDLE state.
5908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false.
5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void)
5917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
5919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet_In = false;
5920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet_Out = false;
5921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bRet_In = allocate_input_done();
5923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bRet_Out = allocate_output_done();
5924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bRet_In && bRet_Out)
5926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bRet = true;
5928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
5931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateInputDone
5935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if I/P buffer pool is allocated by IL Client or not.
5938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false.
5944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void)
5947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
5949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0;
5950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_mem_ptr == NULL)
5952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return bRet;
5954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_inp_mem_ptr )
5956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;i<drv_ctx.ip_buf.actualcount;i++)
5958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_inp_bm_count,i))
5960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
5962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i == drv_ctx.ip_buf.actualcount)
5966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
5968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
5969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_inp_bPopulated = OMX_TRUE;
5973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
5975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
5977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
5978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::AllocateOutputDone
5979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
5981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if entire O/P buffer pool is allocated by IL Client or not.
5982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
5984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
5985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
5987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false.
5988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
5990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void)
5991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
5993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned j=0;
5994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr == NULL)
5996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return bRet;
5998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
6001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;j < drv_ctx.op_buf.actualcount;j++)
6003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_out_bm_count,j))
6005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(j == drv_ctx.op_buf.actualcount)
6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
6014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_bEnabled)
6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_out_bPopulated = OMX_TRUE;
6017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
6023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
6024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ReleaseDone
6025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
6027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if IL client has released all the buffers.
6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
6034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void)
6037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(release_input_done())
6041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(release_output_done())
6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bRet = true;
6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
6053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ReleaseOutputDone
6054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if IL client has released all the buffers.
6057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
6063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void)
6066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0,j=0;
6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_out_mem_ptr)
6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j < drv_ctx.op_buf.actualcount ; j++)
6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(BITMASK_PRESENT(&m_out_bm_count,j))
6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j == drv_ctx.op_buf.actualcount)
6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_out_bm_count = 0;
6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bRet = true;
6084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_bm_count = 0;
6089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
6095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::ReleaseInputDone
6096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
6098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Checks if IL client has released all the buffers.
6099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
6101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
6102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
6104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  true/false
6105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
6107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void)
6108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool bRet = false;
6110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0,j=0;
6111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
6113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_inp_mem_ptr)
6114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j<drv_ctx.ip_buf.actualcount;j++)
6116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if( BITMASK_PRESENT(&m_inp_bm_count,j))
6118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
6120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j==drv_ctx.ip_buf.actualcount)
6123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bRet = true;
6125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = true;
6130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return bRet;
6132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
6135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_BUFFERHEADERTYPE * buffer)
6136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
6138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
6139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (output_flush_progress)
6144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
6146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
6147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nTimeStamp = 0;
6148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
6149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
6151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer, buffer->pBuffer);
6155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_output_buffers --;
61566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Output EOS has been reached");
6160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!output_flush_progress)
6161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
6162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame)
6164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
6166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = NULL;
6167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame)
6169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFilledLen = 0;
6171dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
6172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame = NULL;
6173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6178dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (outputBufferFile1)
6179dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
6180dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    fwrite (buffer->pBuffer,1,buffer->nFilledLen,
6181dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  outputBufferFile1);
6182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* For use buffer we need to copy the data */
6186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!output_flush_progress)
6187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6188dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    time_stamp_dts.get_next_timestamp(buffer,
6189dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
6190dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     ?true:false);
6191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_cb.FillBufferDone)
6193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFilledLen > 0)
6195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6196dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (client_extradata)
6197dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        handle_extradata(buffer);
6198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep min timestamp interval to handle corrupted bit stream scenario
6200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        set_frame_rate(buffer->nTimeStamp);
6201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (arbitrary_bytes)
6202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        adjust_timestamp(buffer->nTimeStamp);
6203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (perf_flag)
6204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!proc_frms)
6206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.stop();
6208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          latency = dec_time.processing_time_us() - latency;
6209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
6210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.start();
6211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.start();
6212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        proc_frms++;
6214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_U64 proc_time = 0;
6217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.stop();
6218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_time = fps_metrics.processing_time_us();
6219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
6220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            proc_frms, (float)proc_time / 1e6,
6221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (float)(1e6 * proc_frms) / proc_time);
6222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_frms = 0;
6223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputExtradataFile)
6228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
6231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *)
6232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           ((unsigned)(buffer->pBuffer + buffer->nOffset +
6233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen + 3)&(~3));
6234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra &&
6235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) )
6236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
6238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
6239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == OMX_ExtraDataNone)
6240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
6244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
6249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = LLONG_MAX;
6250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rst_prev_ts = true;
6251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
6254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
6255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->pPlatformPrivate)->entryList->entry;
6256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
6257dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    m_cb.FillBufferDone (hComp,m_app_data,buffer);
6258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
6259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
6266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
6269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_BUFFERHEADERTYPE* buffer)
6270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
6273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
6275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorBadParameter;
6276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer, buffer->pBuffer);
6280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_input_buffers--;
6281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (arbitrary_bytes)
6283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pdest_frame == NULL && input_flush_progress == false)
6285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
6287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = buffer;
6288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
6289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nTimeStamp = LLONG_MAX;
6290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        push_input_buffer (hComp);
6291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
6295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
6296dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL))
6297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
6299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(m_cb.EmptyBufferDone)
6303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
6305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (input_use_buffer == true){
6306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6313dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
6314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message)
6315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec* omx = NULL;
6317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_msginfo *vdec_msg = NULL;
6318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
6319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_buffer *v4l2_buf_ptr=NULL;
6320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_output_frameinfo *output_respbuf = NULL;
6321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc=1;
6322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (context == NULL || message == NULL)
6323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
6325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
6326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  vdec_msg = (struct vdec_msginfo *)message;
6328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx = reinterpret_cast<omx_vdec*>(context);
6330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6331dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef _ANDROID_
6332dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (omx->m_debug_timestamp)
6333dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
6334dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
6335dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         !(omx->output_flush_progress) )
6336dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
6337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      OMX_TICKS expected_ts = 0;
6338dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      omx->m_timestamp_list.pop_min_ts(expected_ts);
6339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
6340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                       vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
6341dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
6342dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
6343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
6344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
6345dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
6346dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
6347dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
6348dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
6349dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
6350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (vdec_msg->msgcode)
6351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_HW_ERROR:
6354dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event (NULL,vdec_msg->status_code,\
6355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_START_DONE:
6359dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event (NULL,vdec_msg->status_code,\
6360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_START_DONE);
6361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_STOP_DONE:
6364dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event (NULL,vdec_msg->status_code,\
6365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_STOP_DONE);
6366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_RESUME_DONE:
6369dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event (NULL,vdec_msg->status_code,\
6370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_RESUME_DONE);
6371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_PAUSE_DONE:
6374dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event (NULL,vdec_msg->status_code,\
6375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
6376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  break;
6377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
6379dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event (NULL,vdec_msg->status_code,\
6380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
6381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
6383dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event (NULL,vdec_msg->status_code,\
6384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
6385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_INPUT_FLUSHED:
6387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
6388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6389dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // omxhdr = (OMX_BUFFERHEADERTYPE* )		\
6390dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      //        vdec_msg->msgdata.input_frame_clientdata;
6391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
6393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
6394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omxhdr == NULL ||
6395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
6396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       omxhdr = NULL;
6398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       vdec_msg->status_code = VDEC_S_EFATAL;
6399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
64006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
6403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
6405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int64_t *timestamp;
6406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      timestamp = (int64_t *) malloc(sizeof(int64_t));
6407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (timestamp) {
6408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
6409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
6410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
6411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
6412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             vdec_msg->msgdata.output_frame.time_stamp);
6413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
6416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
6417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
6419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
6420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
6421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
6422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		      vdec_msg->msgdata.output_frame.pic_type);
64236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omxhdr && omxhdr->pOutputPortPrivate &&
6425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
6426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
6427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
6428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
6430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
6432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
6433dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        omxhdr->nTimeStamp = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nTimeStamp;
6434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)
6437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
6438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
6439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  //rc = -1;
6440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
6441dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	vdec_msg->msgdata.output_frame.bufferaddr=omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
6442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf = (struct vdec_output_frameinfo *)\
6443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          omxhdr->pOutputPortPrivate;
6444dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->framesize.bottom =
6445dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        //  vdec_msg->msgdata.output_frame.framesize.bottom;
6446dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->framesize.left =
6447dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	//   vdec_msg->msgdata.output_frame.framesize.left;
6448dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->framesize.right =
6449dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	//   vdec_msg->msgdata.output_frame.framesize.right;
6450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->framesize.top =
6451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	//   vdec_msg->msgdata.output_frame.framesize.top;
6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
6453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
6454dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
6455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
6456dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
6457dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	// output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (omx->output_use_buffer)
6460dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          memcpy ( omxhdr->pBuffer,
6461dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   (vdec_msg->msgdata.output_frame.bufferaddr +
6462dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    vdec_msg->msgdata.output_frame.offset),
6463dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    vdec_msg->msgdata.output_frame.len );
6464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nFilledLen = 0;
6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
6468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_FBD);
6469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
6471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      omx->post_event (NULL, vdec_msg->status_code,
6472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EOS_DONE);
6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      omx->post_event (NULL, vdec_msg->status_code,
6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_CONFIG_CHANGED:
6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed");
6479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6480dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     OMX_COMPONENT_GENERATE_PORT_RECONFIG);
6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed info");
6485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // get_buffer_req and populate port defn structure
6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->m_port_def.nPortIndex = 1;
6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = omx->update_portdef(&(omx->m_port_def));
6489dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6490dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
6491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
6494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return rc;
6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
6500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   OMX_HANDLETYPE hComp,
6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   OMX_BUFFERHEADERTYPE *buffer
6502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                           )
6503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned address,p2,id;
6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Empty this arbitrary");
6506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer == NULL)
6508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
6512dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
6513dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
6514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
6516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return buffer if input flush in progress */
6517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
6518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
6519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
6521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
6522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (psource_frame == NULL)
6526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6527dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
6528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psource_frame = buffer;
6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
6530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    push_input_buffer (hComp);
6531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
6535dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL))
6536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
6543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned address,p2,id;
6548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
6549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (pdest_frame == NULL || psource_frame == NULL)
6551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if we have a destination buffer*/
6553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame == NULL)
6554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
6556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_free_q.m_size)
6557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_free_q.pop_entry(&address,&p2,&id);
6559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
6560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFilledLen = 0;
6561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = LLONG_MAX;
6562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
6563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if we have a destination buffer*/
6567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame == NULL)
6568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
6570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_pending_q.m_size)
6571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_pending_q.pop_entry(&address,&p2,&id);
6573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
6574dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
6575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                psource_frame->nTimeStamp);
6576dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
6577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame->nFlags,psource_frame->nFilledLen);
6578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while ((pdest_frame != NULL) && (psource_frame != NULL))
6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch (codec_type_parse)
6587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_MPEG4:
6589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_H263:
6590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_MPEG2:
6591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret =  push_input_sc_codec(hComp);
6592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_H264:
6594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = push_input_h264(hComp);
6595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_VC1:
6597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = push_input_vc1(hComp);
6598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ret != OMX_ErrorNone)
6601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
6603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx_report_error ();
6604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
6609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
6612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 partial_frame = 1;
6614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
6615dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned address,p2,id;
6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6617dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
6618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame,psource_frame->nTimeStamp);
6619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_frame_parser.parse_sc_frame(psource_frame,
6620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       pdest_frame,&partial_frame) == -1)
6621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
6623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (partial_frame == 0)
6627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6628dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
6629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen,psource_frame,frame_count);
6630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6632dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
6633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*First Parsed buffer will have only header Hence skip*/
6634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (frame_count == 0)
6635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
6637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
6639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         codec_type_parse == CODEC_TYPE_DIVX) {
6640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4StreamType psBits;
6641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.numBytes = pdest_frame->nFilledLen;
6643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4_headerparser.parseHeader(&psBits);
6644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_count++;
6647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
6651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pdest_frame->nFilledLen)
6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
6654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
6655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
6659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_input_free_q.m_size)
6662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_input_free_q.pop_entry(&address,&p2,&id);
6664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
6665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen = 0;
6666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
6669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
6671dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
6672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
6673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6678dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
6679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if Destination Buffer is full*/
6680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pdest_frame->nAllocLen ==
6681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFilledLen + pdest_frame->nOffset)
6682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
6684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorStreamCorrupt;
6685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (psource_frame->nFilledLen == 0)
6689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
6691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pdest_frame)
6693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags |= psource_frame->nFlags;
6695dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
6696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
6697dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
6698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,frame_count++);
6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
6700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
6701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
6705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
6706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
6710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
6711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(generate_ebd)
6714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
6716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
6717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = NULL;
6718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_pending_q.m_size)
6720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
6722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_pending_q.pop_entry(&address,&p2,&id);
6723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
6724dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
6725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                psource_frame->nTimeStamp);
6726dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
6727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psource_frame->nFlags,psource_frame->nFilledLen);
6728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
6732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
6735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 partial_frame = 1;
6737dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned address,p2,id;
6738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL isNewFrame = OMX_FALSE;
6739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
6740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (h264_scratch.pBuffer == NULL)
6742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
6744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6746dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
6747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
6748dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
6749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (h264_scratch.nFilledLen && look_ahead_nal)
6750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
6752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
6753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nFilledLen)
6754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.pBuffer,h264_scratch.nFilledLen);
6757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
6758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
6759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nFilledLen = 0;
6760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
6764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nal_length == 0)
6768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
6770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_sc_frame(psource_frame,
6771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
6772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
6774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_h264_nallength(psource_frame,
6781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
6784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
6785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (partial_frame == 0)
6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
6793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nal_count++;
6794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nFlags = psource_frame->nFlags;
6796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6799dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(h264_scratch.nFilledLen)
6801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 NALU_TYPE_SPS);
6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
6805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
6807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
6808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // If timeinfo is present frame info from SEI is already processed
6810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
6812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
6814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_count++;
6815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
6816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nTimeStamp = h264_last_au_ts;
6817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFlags = h264_last_au_flags;
6818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR
6819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
6820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_parser->update_panscan_data(h264_last_au_ts);
6821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
6825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = h264_scratch.nTimeStamp;
6826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_flags = h264_scratch.nFlags;
6827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
6828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
6831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (!VALID_TS(h264_last_au_ts))
6832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_last_au_ts = ts_in_sei;
6833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else
6836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = LLONG_MAX;
6837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!isNewFrame)
6840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
6842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen)
6843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6844dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
6845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.nFilledLen);
6846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.pBuffer,h264_scratch.nFilledLen);
6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
6849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
6850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_scratch.nFilledLen = 0;
6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
6854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
6856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        look_ahead_nal = true;
6862dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
6863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
6864dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
6865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,frame_count++);
6866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pdest_frame->nFilledLen == 0)
6868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
6870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          look_ahead_nal = false;
6871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
6872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               h264_scratch.nFilledLen)
6873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
6876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
6877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen = 0;
6878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
6880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
6882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
6886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
6888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Reset the EOS Flag");
6890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
6891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /*Push the frame to the Decoder*/
6893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
6894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          //frame_count++;
6898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = NULL;
6899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_input_free_q.m_size)
6900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
6901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_input_free_q.pop_entry(&address,&p2,&id);
6902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
6903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
6904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen = 0;
6905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags = 0;
6906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = LLONG_MAX;
6907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
6908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
6913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6914dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
6915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if Destination Buffer is full*/
6916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_scratch.nAllocLen ==
6917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.nFilledLen + h264_scratch.nOffset)
6918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
6920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorStreamCorrupt;
6921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!psource_frame->nFilledLen)
6925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
6927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
6929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pdest_frame)
6931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
6933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
6934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             h264_scratch.nFilledLen)
6935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  h264_scratch.pBuffer,h264_scratch.nFilledLen);
6938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
6939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_scratch.nFilledLen = 0;
6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
6942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
6944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
6947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
6948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6949dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%d TimeStamp = %x",
6950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
6956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!VALID_TS(pdest_frame->nTimeStamp))
6957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = ts_in_sei;
6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
6961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
6962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
6964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
6966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
6967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6970dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame,h264_scratch.nFilledLen);
6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
6973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(generate_ebd && !psource_frame->nFilledLen)
6977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
6979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psource_frame = NULL;
6980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_input_pending_q.m_size)
6981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
6983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_pending_q.pop_entry(&address,&p2,&id);
6984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
6985dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
6986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame->nFlags,psource_frame->nFilledLen);
6987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
6990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
6993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U8 *buf, *pdest;
6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 partial_frame = 1;
6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 buf_len, dest_len;
6997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(first_frame == 0)
6999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        first_frame = 1;
7001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
7002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_vendor_config.pData)
7003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
7005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buf = psource_frame->pBuffer;
7006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buf_len = psource_frame->nFilledLen;
7007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
7009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                VC1_SP_MP_START_CODE)
7010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_vc1_profile = VC1_SP_MP_RCV;
7012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
7014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_vc1_profile = VC1_AP;
7016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
7018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorStreamCorrupt;
7021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nOffset;
7027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
7028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nOffset);
7029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(dest_len < m_vendor_config.nDataSize)
7031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nDestination buffer full\n");
7033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorBadParameter;
7034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
7036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
7038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
7039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(m_vc1_profile)
7044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case VC1_AP:
7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
7047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
7048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
7049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
7050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorBadParameter;
7051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
7052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case VC1_SP_MP_RCV:
7055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        default:
7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n");
7057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
7058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
7064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
7065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	      struct ion_fd_data *fd_data, int flag)
7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int fd = -EINVAL;
7068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -EINVAL;
7069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_dev_flag;
7070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ion ion_buf_info;
7071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!alloc_data || buffer_size <= 0 || !fd_data) {
7072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
7073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return -EINVAL;
7074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
707563a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  ion_dev_flag = O_RDONLY;
7076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd = open (MEM_DEVICE, ion_dev_flag);
7077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (fd < 0) {
7078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
7079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
7080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
708163a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  alloc_data->flags = 0;
708263a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  if(!secure_mode && (flag & ION_FLAG_CACHED))
708363a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  {
708463a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev    alloc_data->flags |= ION_FLAG_CACHED;
708563a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  }
7086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->len = buffer_size;
7087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->align = clip2(alignment);
7088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (alloc_data->align < 4096)
7089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->align = 4096;
7091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7092dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(secure_mode) {
7093dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
7094dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    alloc_data->flags |= ION_SECURE;
7095dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  } else {
7096dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
7097dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
7099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc || !alloc_data->handle) {
7100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
7101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->handle = NULL;
7102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
7105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd_data->handle = alloc_data->handle;
7107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_MAP,fd_data);
7108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc) {
7109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION MAP failed ");
7110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_alloc_data = *alloc_data;
7111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_device_fd = fd;
7112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.fd_ion_data = *fd_data;
7113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_ion_memory(&ion_buf_info);
7114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd_data->fd =-1;
7115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return fd;
7120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
7123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(!buf_ion_info) {
7125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
7126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return;
7127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
7129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             &buf_ion_info->ion_alloc_data.handle)) {
7130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free failed" );
7131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     close(buf_ion_info->ion_device_fd);
7133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_device_fd = -1;
7134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_alloc_data.handle = NULL;
7135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->fd_ion_data.fd = -1;
7136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7137dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#else
7138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
7139dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                  OMX_U32 alignment)
7140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
7141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct pmem_allocation allocation;
7142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  allocation.size = buffer_size;
7143dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  allocation.align = clip2(alignment);
7144dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (allocation.align < 4096)
7145dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7146dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    allocation.align = 4096;
7147dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
7149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7150dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
7151dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      allocation.align, allocation.size);
7152dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
7153dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7154dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return true;
7155dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
7156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
7158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
7160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_use_buffer = false;
7161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ouput_egl_buffers = false;
7162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
7164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (m_out_mem_ptr);
7166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = NULL;
7167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_platform_list)
7170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free(m_platform_list);
7172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_platform_list = NULL;
7173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_respbuffer)
7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_respbuffer);
7178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = NULL;
7179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_outputbuffer)
7181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_outputbuffer);
7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = NULL;
7184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
7197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (arbitrary_bytes)
7198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_frame_parser.mutils)
7200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free utils parser");
7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete (m_frame_parser.mutils);
7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils = NULL;
7204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_inp_heap_ptr)
7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input Heap Pointer");
7209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_inp_heap_ptr);
7210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_inp_heap_ptr = NULL;
7211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_phdr_pmem_ptr)
7214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_phdr_pmem_ptr);
7217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_phdr_pmem_ptr = NULL;
7218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_mem_ptr)
7221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
7223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (m_inp_mem_ptr);
7224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_inp_mem_ptr = NULL;
7225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer)
7227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Driver Context pointer");
7229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (drv_ctx.ptr_inputbuffer);
7230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer = NULL;
7231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
7234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free ion context");
7235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.ip_buf_ion_info);
7236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7240dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid omx_vdec::stream_off()
7241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc=0;
7243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum v4l2_buf_type btype;
7244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
7247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/*TODO: How to handle this case */
7248dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Failed to call streamoff on OUTPUT Port \n");
7249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	} else {
7250dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		streaming[CAPTURE_PORT] = false;
7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
7255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_requestbuffers bufreq;
7258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int buf_size = 0, extra_data_size = 0;
7259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_format fmt;
7260dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int ret;
7261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	bufreq.memory = V4L2_MEMORY_USERPTR;
7264dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(in_reconfig == true)
7265dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	bufreq.count = 0;
7266dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	else
7267dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	bufreq.count = 2;
7268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
7269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fmt.fmt.pix_mp.pixelformat = output_capability;
7272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
7273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fmt.fmt.pix_mp.pixelformat = capture_capability;
7276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }else {eRet = OMX_ErrorBadParameter;}
7277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(eRet==OMX_ErrorNone){
7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(ret)
7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	/*TODO: How to handle this case */
7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	return eRet;
7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_prop->actualcount = bufreq.count;
7290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_prop->mincount = bufreq.count;
7291dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  printf("Count = %d \n ",bufreq.count);
7292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
7297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
7300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7301dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  drv_ctx.video_resolution.frame_height = fmt.fmt.pix_mp.height;
7302dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  drv_ctx.video_resolution.frame_width = fmt.fmt.pix_mp.width;
7303dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7304dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  printf("Buffer Size = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
7305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(ret)
7307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	/*TODO: How to handle this case */
7309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
7311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
7315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = buffer_prop->buffer_size;
7316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
7319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
7320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_INTERLACE_EXTRADATA)
7322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_HIGH("Interlace extra data enabled!");
7324dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
7325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_PORTDEF_EXTRADATA)
7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7328dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
7329dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
7330dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         extra_data_size);
7331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7332dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (extra_data_size)
7333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7334dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
7335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
7336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buf_size += extra_data_size;
7338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
7340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
7341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig) // BufReq will be set to driver when port is disabled
7342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (buf_size != buffer_prop->buffer_size)
7344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = set_buffer_req(buffer_prop);
7347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
7355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned buf_size = 0;
7358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_format fmt;
7359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ret;
7360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
7361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buf_size != buffer_prop->buffer_size)
7364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size, buf_size);
7367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadParameter;
7368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
7372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
7373dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
7374dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
7375dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	fmt.fmt.pix_mp.pixelformat = output_capability;
7376dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
7377dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandfmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7378dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	fmt.fmt.pix_mp.pixelformat = capture_capability;
7379dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} else {eRet = OMX_ErrorBadParameter;}
7380dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
7381dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(ret)
7382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  /*TODO: How to handle this case */
7384dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("Setting buffer requirements failed");
7385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInsufficientResources;
7386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7387b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand  }
7388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7391dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_ERRORTYPE omx_vdec::start_port_reconfig()
7392dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
7393dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7394dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7395dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  enum v4l2_buf_type btype;
7396dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc = 0,i;
7397dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_plane plane;
7398dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_buffer v4l2_buf ={0};
7399dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_decoder_cmd dec;
7400dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  dec.cmd = V4L2_DEC_CMD_STOP;
7401dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec);
7402dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
7403dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  in_reconfig = true;
7404dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return eRet;
7405dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
7406dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7409dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7411dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = NULL;
7412dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = &drv_ctx.video_resolution;
7413dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg)*/0)
7414dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7415dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
7416dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    eRet = OMX_ErrorHardware;
7417dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!portDefn)
7425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
7429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
7430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nSize = sizeof(portDefn);
7431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->eDomain    = OMX_PortDomainVideo;
7432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.frame_rate.fps_denominator > 0)
7433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
7434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        drv_ctx.frame_rate.fps_denominator;
7435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else {
7436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
7437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (0 == portDefn->nPortIndex)
7440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirInput;
7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
7443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
7444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
7445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
7446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = eCompressionFormat;
7447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_inp_bEnabled;
7448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_inp_bPopulated;
7449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (1 == portDefn->nPortIndex)
7451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7452dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    portDefn->eDir =  OMX_DirOutput;
7453dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    eRet=get_buffer_req(&drv_ctx.op_buf);
7454dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (in_reconfig)
7455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
7456dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
7457dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->nBufferCountMin    = op_buf_rcnfg.mincount;
7458dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->nBufferSize        = op_buf_rcnfg.buffer_size;
7459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7460dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
7461dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
7462dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
7463dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
7464dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->nBufferSize        = drv_ctx.op_buf.buffer_size;
7465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
7467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_out_bEnabled;
7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_out_bPopulated;
7469dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
7470dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
7471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else if (drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
7472dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
7473dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
7474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
7475dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
7476dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("ERROR: Color format unknown: %x\n", drv_ctx.output_format);
7477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7481dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    portDefn->eDir = OMX_DirMax;
7482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->nPortIndex);
7484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
7487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
7488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
7489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
7490dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("update_portdef Width = %d Height = %d Stride = %u"
7491dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    "SliceHeight = %u \n", portDefn->format.video.nFrameHeight,
7492dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    portDefn->format.video.nFrameWidth,
7493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nStride,
7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nSliceHeight);
7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
7503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i= 0;
7504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_out_mem_ptr) {
7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nBufHdrSize        = 0;
7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformEntrySize = 0;
7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformListSize  = 0;
7510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPMEMInfoSize = 0;
7511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
7512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
7514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
7516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
7523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
7524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
7526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE),
7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPMEMInfoSize,
7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPlatformListSize);
7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
7532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         m_out_bm_count);
7533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Alloc mem for platform specific info
7535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *pPtr=NULL;
7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     nPMEMInfoSize,1);
7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
7546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
7550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer)
7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufHdr          =  m_out_mem_ptr;
7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_list)  + nPlatformListSize);
7556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
7557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_entry) + nPlatformEntrySize);
7558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList   = m_platform_list;
7559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry  = m_platform_entry;
7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo       = m_pmem_info;
7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Settting the entire storage nicely
7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_ptr,pPlatformEntry);
7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
7568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
7569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
7571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
7572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Set the values when we determine the right HxW param
7573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
7574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nFilledLen         = 0;
7575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
7576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
7577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
7578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->entry      = pPMEMInfo;
7579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform List
7580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->nEntries    = 1;
7581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->entryList   = pPlatformEntry;
7582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep pBuffer NULL till vdec is opened
7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pBuffer            = NULL;
7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->pmem_fd = 0;
7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pPlatformPrivate = pPlatformList;
7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Create a mapping between buffers*/
7592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
7594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Move the buffer and buffer header pointers
7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr++;
7597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo++;
7598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry++;
7599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList++;
7600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7604dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        m_out_mem_ptr, pPtr);
7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_out_mem_ptr)
7607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_out_mem_ptr);
7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_out_mem_ptr = NULL;
7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPtr)
7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPtr);
7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPtr = NULL;
7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
7620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
7625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =  OMX_ErrorInsufficientResources;
7634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet =  OMX_ErrorInsufficientResources;
7637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
7642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p1;
7644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p2;
7645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned ident;
7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_cmd_queue tmp_q, pending_bd_q;
7647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
7648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE FDB from ftb queue
7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_ftb_q.m_size)
7650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.pop_entry(&p1,&p2,&ident);
7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_FBD)
7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
7655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to ftb queue
7662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
7665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.insert_entry(p1,p2,ident);
7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE EDB from etb queue
7668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_etb_q.m_size)
7669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.pop_entry(&p1,&p2,&ident);
7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_EBD)
7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
7674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to etb queue
7681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.insert_entry(p1,p2,ident);
7685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
7687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // process all pending buffer dones
7688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(pending_bd_q.m_size)
7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_bd_q.pop_entry(&p1,&p2,&ident);
7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(ident)
7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_EBD:
7694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
7697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
7698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_FBD:
7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
7713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 new_frame_interval = 0;
7715dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
7717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
7718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    new_frame_interval = (act_timestamp > prev_ts)?
7720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          act_timestamp - prev_ts :
7721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          prev_ts - act_timestamp;
7722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (new_frame_interval < frm_int || frm_int == 0)
7723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frm_int = new_frame_interval;
7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(frm_int)
7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_numerator = 1e6;
7728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_denominator = frm_int;
7729dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         frm_int, drv_ctx.frame_rate.fps_numerator /
7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         (float)drv_ctx.frame_rate.fps_denominator);
7732dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        ioctl_msg.in = &drv_ctx.frame_rate;
7733dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
7734dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  (void*)&ioctl_msg) < */0)
7735dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
7736dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_ERROR("Setting frame rate failed");
7737dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prev_ts = act_timestamp;
7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rst_prev_ts && VALID_TS(act_timestamp))
7747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = act_timestamp;
7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = false;
7750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (VALID_TS(prev_ts))
7752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bool codec_cond = (drv_ctx.timestamp_adjust)?
7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(frm_int > 0 && codec_cond)
7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      act_timestamp = prev_ts + frm_int;
7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = act_timestamp;
7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(act_timestamp);
7766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (frm_int > 0)           // In this case the frame rate was set along
7768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {                               // with the port definition, start ts with 0
7769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
7770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
7771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_conceal_MB = 0;
7778dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_S64 ts_in_sei = 0;
7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 frame_rate = 0;
7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_extra = (OMX_OTHER_EXTRADATATYPE *)
7781dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
7782dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            p_buf_hdr->nFilledLen + 3)&(~3));
7783dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = NULL;
7785dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
7786dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7787dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // Process driver extradata
7788dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
7789dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
7790dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
7791dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
7792dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (p_extra->nSize < p_extra->nDataSize)
7793dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
7794dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
7795dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                          p_extra->nSize, p_extra->nDataSize);
7796dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7797dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
7798dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            p_extra->nDataSize == 0)
7799dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          p_extra = NULL;
7800dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          continue;
7801dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
7802dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
7803dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
7804dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7805dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          num_conceal_MB = count_MB_in_extradata(p_extra);
7806dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
7807dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          // Map driver extradata to corresponding OMX type
7808dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
7809dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        else
7810dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
7811dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (m_debug_concealedmb) {
7812dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
7813b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand        }
7814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7815dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else if (p_extra->eType == VDEC_EXTRADATA_SEI)
7816dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
7817dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_sei = p_extra;
7818dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7819dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
7820dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7821dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
7822dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
7823dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else if (p_extra->eType == VDEC_EXTRADATA_VUI)
7824dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
7825dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_vui = p_extra;
7826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7827dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
7828dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7829dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
7830dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
7831dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      print_debug_extradata(p_extra);
7832dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7833dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
7834dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          p_extra->nDataSize == 0)
7835dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_extra = NULL;
7836dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
7837dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
7838dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
7839dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      // Driver extradata is only exposed if MB map is requested by client,
7840dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      // otherwise can be overwritten by omx extradata.
7841dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      p_extra = (OMX_OTHER_EXTRADATATYPE *)
7842dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
7843dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                p_buf_hdr->nFilledLen + 3)&(~3));
7844dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
7845dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
7846dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7847dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7848dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7849dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
7850dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7851dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7852dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
7853dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (p_vui)
7854dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
7855dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (p_sei)
7856dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
7857dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
7858dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (!VALID_TS(p_buf_hdr->nTimeStamp))
7859dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_buf_hdr->nTimeStamp = ts_in_sei;
7860dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
7861dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
7862dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      // If timeinfo is present frame info from SEI is already processed
7863dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
7864dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7865dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
7866dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
7867dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
7868dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7869dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7870dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
7871dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    append_interlace_extradata(p_extra,
7872dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format);
7873dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7874dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7875dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
7876dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
7877dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7878dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7879dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
7880dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    /* vui extra data (frame_rate) information */
7881dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (h264_parser)
7882dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        h264_parser->get_frame_rate(&frame_rate);
7883dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    append_frame_info_extradata(p_extra, num_conceal_MB,
7884dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
7885dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        p_buf_hdr->nTimeStamp, frame_rate, NULL);
7886dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7887dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7888dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
7889dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       p_extra != NULL &&
7890dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
7891dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7892dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7893dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
7894dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    append_portdef_extradata(p_extra);
7895dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
7896dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7897dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
7898dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (p_extra &&
7899dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
7900dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
7901dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      append_terminator_extradata(p_extra);
7902dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
7903dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
7904dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
7905dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
7906dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7909dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
7910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
7912dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 driver_extradata = 0, extradata_size = 0;
7913dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state != OMX_StateLoaded)
7915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorIncorrectStateOperation;
7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7919dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
7920dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
7921dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (requested_extradata & OMX_INTERLACE_EXTRADATA)
7922dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
7923dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (requested_extradata & OMX_PORTDEF_EXTRADATA)
7924dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7925dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
7926dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7927dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
7928dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    client_extradata, requested_extradata, enable);
7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7930dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (enable)
7931dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    requested_extradata |= client_extradata;
7932dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
7933dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7934dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    requested_extradata = client_extradata & ~requested_extradata;
7935dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    extradata_size *= -1;
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7938dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
7939dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
7940dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
7941dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7942dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
7943dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7944dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
7945dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                          VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
7946dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
7947dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                          VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
7948dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7949dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7950dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
7951dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (driver_extradata != drv_ctx.extradata)
7952dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7953dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    client_extradata = requested_extradata;
7954dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    drv_ctx.extradata = driver_extradata;
7955dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //ioctl_msg.in = &drv_ctx.extradata;
7956dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //ioctl_msg.out = NULL;
7957dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
7958dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //    (void*)&ioctl_msg) < 0)
7959dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //{
7960dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      //  DEBUG_PRINT_ERROR("\nSet extradata failed");
7961dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      //  ret = OMX_ErrorUnsupportedSetting;
7962dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //}   // else
7963dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // ret = get_buffer_req(&drv_ctx.op_buf);
7964dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
7965dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
7966dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
7967dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    client_extradata = requested_extradata;
7968dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    drv_ctx.op_buf.buffer_size += extradata_size;
7969dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // align the buffer size
7970dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1));
7971dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size);
7972dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
7973dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
7974dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  ret = set_buffer_req(&drv_ctx.op_buf);
7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *data_ptr = extra->data, data = 0;
7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (byte_count < extra->nDataSize)
7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data = *data_ptr;
7986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (data)
7987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      num_MB += (data&0x01);
7989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      data >>= 1;
7990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data_ptr++;
7992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    byte_count++;
7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_debug_extradata)
8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return;
8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH(
8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "============== Extra Data ==============\n"
8006dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    "           Size: %u \n"
8007dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    "        Version: %u \n"
8008dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    "      PortIndex: %u \n"
8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Type: %x \n"
8010dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    "       DataSize: %u \n",
8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nSize, extra->nVersion.nVersion,
8012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nPortIndex, extra->eType, extra->nDataSize);
8013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8014dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (extra->eType == OMX_ExtraDataInterlaceFormat)
8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "------ Interlace Format ------\n"
8019dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "                Size: %u \n"
8020dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "             Version: %u \n"
8021dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "           PortIndex: %u \n"
8022dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      " Is Interlace Format: %u \n"
8023dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "   Interlace Formats: %u \n"
8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "=========== End of Interlace ===========\n",
8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
8026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8028dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else if (extra->eType == OMX_ExtraDataFrameInfo)
8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "-------- Frame Format --------\n"
8034dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "             Picture Type: %u \n"
8035dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "           Interlace Type: %u \n"
8036dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      " Pan Scan Total Frame Num: %u \n"
8037dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "   Concealed Macro Blocks: %u \n"
8038dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "               frame rate: %u \n"
8039dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "           Aspect Ratio X: %u \n"
8040dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      "           Aspect Ratio Y: %u \n",
8041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->ePicType,
8042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->interlaceType,
8043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->panScan.numWindows,
8044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nConcealedMacroblocks,
8045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nFrameRate,
8046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioX,
8047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioY);
8048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8049dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for (int i = 0; i < fminfo->panScan.numWindows; i++)
8050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH(
8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "------------------------------\n"
8053dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "     Pan Scan Frame Num: %d \n"
8054dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "            Rectangle x: %d \n"
8055dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "            Rectangle y: %d \n"
8056dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "           Rectangle dx: %d \n"
8057dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        "           Rectangle dy: %d \n",
8058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
8059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
8060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
8063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataNone)
8065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
8067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
8071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_U32 interlaced_format_type)
8076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STREAMINTERLACEFORMAT *interlace_format;
8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 mbaff = 0;
8079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
8080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
8083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
8087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
8089dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if ((interlaced_format_type == VDEC_InterlaceFrameProgressive)  && !mbaff)
8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_FALSE;
8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
8093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
8094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_TRUE;
8098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8106dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp, OMX_U32 frame_rate,
8107dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	vdec_aspectratioinfo *aspect_ratio_info)
8108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
8111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
8115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (picture_type)
8117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_I:
8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_P:
8122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_B:
8125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
8126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
8128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
8129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
8132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
8133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
8134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
8136dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  memset(&frame_info->panScan,0,sizeof(frame_info->panScan));
8137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
8138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8139dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
8140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
8141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    h264_parser->fill_aspect_ratio_info(&frame_info->aspectRatio);
8142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
8143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nConcealedMacroblocks = num_conceal_mb;
8144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nFrameRate = frame_rate;
8145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
8151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_PORTDEF_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_ExtraDataPortDef;
8155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
8156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
8157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  *portDefn = m_port_def;
8158dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
8159dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
8160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nFrameWidth,
8161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nStride,
8162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nSliceHeight);
8163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
8168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = OMX_ExtraDataNone;
8170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = 0;
8171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->data[0] = 0;
8172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
8177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
8179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index >= drv_ctx.ip_buf.actualcount)
8180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
8182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr = (desc_buffer_hdr*) \
8187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(desc_buffer_hdr)),
8188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
8189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_desc_buffer_ptr == NULL)
8190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
8192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
8197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr[index].buf_addr == NULL)
8198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
8200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
8207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8208dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
8209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_demux_entries < 8192)
8210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_offsets[m_demux_entries++] = address_offset;
8212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
8217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
8219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
8220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 index = 0;
8221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (index < bytes_to_parse)
8225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
8228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x01)) )
8230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //Found start code, insert address offset
8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      insert_demux_addr_offset(index);
8233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf[index+2] == 0x01) // 3 byte start code
8234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 3;
8235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else                      //4 byte start code
8236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 4;
8237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index++;
8240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8241dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
8242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //fix this, handle 3 byte start code, vc1 terminator entry
8248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *p_demux_data = NULL;
8249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 desc_data = 0;
8250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 start_addr = 0;
8251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 nal_size = 0;
8252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 suffix_byte = 0;
8253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 demux_index = 0;
8254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 buffer_index = 0;
8255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
8259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
8263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer_index > drv_ctx.ip_buf.actualcount)
8264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8265dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index);
8266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
8270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ( ((OMX_U8*)p_demux_data == NULL) ||
8272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
8273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
8275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (; demux_index < m_demux_entries; demux_index++)
8280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      start_addr = m_demux_offsets[demux_index];
8283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
8284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
8286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
8290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (demux_index < (m_demux_entries - 1))
8292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
8294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
8298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8299dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
8300dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        start_addr,
8301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        suffix_byte,
8302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nal_size,
8303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        demux_index);
8304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = (start_addr >> 3) << 1;
8305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= (start_addr & 7) << 21;
8306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= suffix_byte << 24;
8307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
8310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (codec_type_parse == CODEC_TYPE_VC1)
8316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("VC1 terminator entry");
8318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0x82 << 24;
8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
8322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_demux_entries++;
8326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //Add zero word to indicate end of descriptors
8328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(p_demux_data, 0, sizeof(OMX_U32));
8329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
8331dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
8332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
8334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Demux table complete!");
8336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
8337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#if 0
8340dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_ERRORTYPE omx_vdec::createDivxDrmContext( OMX_PTR drmHandle )
8341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = OMX_ErrorNone;
8343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     if( drmHandle == NULL ) {
8344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_HIGH("\n This clip is not DRM encrypted");
8345dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        iDivXDrmDecrypt = NULL;
8346dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return err;
8347dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     }
8348dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
8349dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     iDivXDrmDecrypt = DivXDrmDecrypt::Create( drmHandle );
8350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (iDivXDrmDecrypt) {
8351dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_LOW("\nCreated DIVX DRM, now calling Init");
8352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(err!=OMX_ErrorNone) {
8354dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nERROR:iDivXDrmDecrypt->Init %d", err);
8355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
8356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
8360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
8361dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return OMX_ErrorUndefined;
8362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return err;
8364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8367