1e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*--------------------------------------------------------------------------
2826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCopyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
3e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRedistribution and use in source and binary forms, with or without
5e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellymodification, are permitted provided that the following conditions are met:
6e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    * Redistributions of source code must retain the above copyright
7e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      notice, this list of conditions and the following disclaimer.
8e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    * Redistributions in binary form must reproduce the above copyright
9e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      notice, this list of conditions and the following disclaimer in the
10e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      documentation and/or other materials provided with the distribution.
11e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    * Neither the name of Code Aurora nor
12e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      the names of its contributors may be used to endorse or promote
13e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      products derived from this software without specific prior written
14e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      permission.
15e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
16e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly--------------------------------------------------------------------------*/
28e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
29e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*============================================================================
30e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            O p e n M A X   w r a p p e r s
31e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             O p e n  M A X   C o r e
32e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
33e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//** @file omx_vdec.cpp
34e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This module contains the implementation of the OpenMAX core & component.
35e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
36e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//*========================================================================*/
37e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
38e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
39e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//                             Include Files
40e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
41e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
42e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <string.h>
43e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <pthread.h>
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
45e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <stdlib.h>
46e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <unistd.h>
47e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <errno.h>
48e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "omx_vdec.h"
49e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <fcntl.h>
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h>
51b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan#include <qdMetaData.h>
52e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h>
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
57e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h>
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if  defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h>
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h"
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01
76e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
77e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv";
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata";
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
92e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_NUM_SPS 32
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_NUM_PPS 256
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR (MAX_NUM_SPS + MAX_NUM_PPS)
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
98e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
99e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SP_MP_START_CODE        0xC5000000
100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SP_MP_START_CODE_MASK   0xFF000000
101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_AP_SEQ_START_CODE       0x0F010000
102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_PROFILE_MASK   0xF0
103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE          0
105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_MAIN_PROFILE            1
106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_ADVANCE_PROFILE         3
107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_LEN            4
110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_POS            8
111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_A_POS            12
112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_B_POS            24
113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SEQ_LAYER_SIZE          36
114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    #define MEM_DEVICE "/dev/ion"
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_720P
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_adsp"
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P_EBI
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_adsp"
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_smipool"
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*
127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    extern "C"{
129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        #include<utils/Log.h>
130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif//_ANDROID_
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*/
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_LOW
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_HIGH
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_ERROR
137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_LOW ALOGV
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_HIGH ALOGV
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_ERROR ALOGE
141d31c34204bae71982ed9e5425cb110ebcb176f45Nick Pelly
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <glib.h>
144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define strlcpy g_strlcpy
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
149d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan#define ALIGN( num, to ) (((num) + (to-1)) & (~(to-1)))
150d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan#define ALIGN32 32
151d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan#define ALIGN16 16
152d31c34204bae71982ed9e5425cb110ebcb176f45Nick Pelly
153fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgebool omx_vdec::m_secure_display = false;
154fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
155ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan#ifdef MAX_RES_1080P
156ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavanstatic const OMX_U32 kMaxSmoothStreamingWidth = 1920;
157ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavanstatic const OMX_U32 kMaxSmoothStreamingHeight = 1088;
158ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan#else
159ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavanstatic const OMX_U32 kMaxSmoothStreamingWidth = 1280;
160ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavanstatic const OMX_U32 kMaxSmoothStreamingHeight = 720;
161ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan#endif
162ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* async_message_thread (void *input)
164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg;
166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_msginfo vdec_msg;
167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int error_code = 0;
169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (1)
172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = NULL;
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = (void*)&vdec_msg;
175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Wait for a message from the video decoder driver*/
176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error_code = ioctl ( omx->drv_ctx.video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,
177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         (void*)&ioctl_msg);
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (error_code == -512) // ERESTARTSYS
179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (error_code < 0)
183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Error in ioctl read next msg");
185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }        /*Call Instance specific process function*/
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (omx->async_message_process(input,&vdec_msg) < 0)
188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Wrong ioctl message");
190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return NULL;
194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* message_thread(void *input)
197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char id;
200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int n;
201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (1)
205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    n = read(omx->m_pipe_in, &id, 1);
208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(0 == n)
210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (1 == n)
215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omx->process_event_cb(omx, id);
217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ((n < 0) && (errno != EINTR))
219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return 0;
226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid post_message(omx_vdec *omx, unsigned char id)
229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      int ret_value;
231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      ret_value = write(omx->m_pipe_out, &id, 1);
233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx_cmd_queue destructor
237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_cmd_queue::~omx_cmd_queue()
238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  // Nothing to do
240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue constructor
243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue insert
249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool ret = true;
252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_q[m_write].id       = id;
255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_q[m_write].param1   = p1;
256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_q[m_write].param2   = p2;
257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_write++;
258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_size ++;
259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_write = 0;
262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ret = false;
267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue pop
273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool ret = true;
276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_size > 0)
277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *id = m_q[m_read].id;
279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *p1 = m_q[m_read].param1;
280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *p2 = m_q[m_read].param2;
281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Move the read pointer ahead
282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ++m_read;
283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    --m_size;
284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_read = 0;
287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ret = false;
292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Retrieve the first mesg type in the queue
297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return m_q[m_read].id;
300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //initialize timestamps array
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //free m_ts_arr_list?
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool duplicate_ts = false;
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //insert at the first available empty location
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_ts_arr_list[idx].valid)
323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found invalid or empty entry, save timestamp
325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].valid = true;
326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].timestamp = ts;
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       ts, idx);
329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int min_idx = -1;
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_TICKS min_ts = 0;
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_ts_arr_list[idx].valid)
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found valid entry, save index
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (min_idx < 0)
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //first valid entry
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (m_ts_arr_list[idx].timestamp < min_ts)
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (min_idx < 0)
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //no valid entries found
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = 0;
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = m_ts_arr_list[min_idx].timestamp;
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[min_idx].valid = false;
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     ts, min_idx);
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[idx].valid = false;
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// factory function executed by the core to create instances
404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid *get_omx_component_factory_fn(void)
405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return (new omx_vdec);
407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     struct ion_handle *handle, int ionMapfd)
413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ion_device_fd = devicefd;
415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ion_handle = handle;
416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    MemoryHeapBase::init(ionMapfd, base, size, 0, MEM_DEVICE);
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
420e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyVideoHeap::VideoHeap(int fd, size_t size, void* base)
421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // dup file descriptor, map once, use pmem
423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_
427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
428e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::omx_vdec
430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
431e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Constructor
433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
434e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None
436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
437e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
440b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wuomx_vdec::omx_vdec(): msg_thread_id(0),
441b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu                      async_thread_id(0),
442b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu                      m_state(OMX_StateInvalid),
443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_app_data(NULL),
444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_mem_ptr(NULL),
445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_mem_ptr(NULL),
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_phdr_pmem_ptr(NULL),
447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      pending_input_buffers(0),
448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      pending_output_buffers(0),
449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_bm_count(0),
450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_bm_count(0),
451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_bPopulated(OMX_FALSE),
452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_bPopulated(OMX_FALSE),
453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_flags(0),
454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_bEnabled(OMX_TRUE),
455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_bEnabled(OMX_TRUE),
456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_platform_list(NULL),
457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_platform_entry(NULL),
458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_pmem_info(NULL),
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      output_flush_progress (false),
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      input_flush_progress (false),
461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      input_use_buffer (false),
462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      output_use_buffer (false),
463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      arbitrary_bytes (true),
464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      psource_frame (NULL),
465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      pdest_frame (NULL),
466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_heap_ptr (NULL),
467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_heap_inp_bm_count (0),
468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      codec_type_parse ((codec_type)0),
469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_frame_meta (true),
470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      frame_count (0),
471090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly                      nal_length(0),
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      nal_count (0),
473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      look_ahead_nal (false),
474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_frame(0),
475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_buffer(NULL),
476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_frame_size (0),
477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_error_propogated(false),
478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_device_file_ptr(NULL),
479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_vc1_profile((vc1_profile_type)0),
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      prev_ts(LLONG_MAX),
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      rst_prev_ts(true),
482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      frm_int(0),
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_in_alloc_cnt(0),
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_display_id(NULL),
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      ouput_egl_buffers(false),
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_parser(NULL),
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      client_extradata(0),
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_last_au_ts(LLONG_MAX),
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_last_au_flags(0),
490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_err_count(0),
491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_heap_ptr(NULL),
493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_heap_count(0),
494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_enable_android_native_buffers(OMX_FALSE),
495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_use_android_native_buffers(OMX_FALSE),
496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      in_reconfig(false),
498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_use_output_pmem(OMX_FALSE),
499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_region_smi(OMX_FALSE),
500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_pvt_entry_pmem(OMX_FALSE),
501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      secure_mode(false)
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,iDivXDrmDecrypt(NULL)
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,m_desc_buffer_ptr(NULL)
506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,m_extradata(NULL)
507b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan                    ,m_use_smoothstreaming(false)
508ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    ,m_smoothstreaming_height(0)
509ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    ,m_smoothstreaming_width(0)
510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* Assumption is that , to begin with , we have all the frames with decoder */
512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Constructor");
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char property_value[PROPERTY_VALUE_MAX] = {0};
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.perf", property_value, "0");
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  perf_flag = atoi(property_value);
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.start();
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    proc_frms = latency = 0;
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_value[0] = NULL;
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.ts", property_value, "0");
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_timestamp = atoi(property_value);
526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.set_timestamp_reorder_mode(true);
530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.enable_debug_print(true);
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_value[0] = NULL;
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.concealedmb", property_value, "0");
535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_concealedmb = atoi(property_value);
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset(&m_cmp,0,sizeof(m_cmp));
540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset(&m_cb,0,sizeof(m_cb));
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (&drv_ctx,0,sizeof(drv_ctx));
542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.timestamp_adjust = false;
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_driver_fd = -1;
549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_vendor_config.pData = NULL;
550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_init(&m_lock, NULL);
5515eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan  pthread_mutex_init(&c_lock, NULL);
552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  sem_init(&m_cmd_lock,0,0);
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char extradata_value[PROPERTY_VALUE_MAX] = {0};
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.extradata", extradata_value, "0");
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_extradata = atoi(extradata_value);
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
55940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
56040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  client_buffers.set_vdec_client(this);
561b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan  memset(native_buffer, 0, sizeof(native_buffer));
562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
566e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::~omx_vdec
568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
569e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Destructor
571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
572e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None
574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
575e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::~omx_vdec()
579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_pmem_info = NULL;
581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Destructor");
582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_pipe_in) close(m_pipe_in);
583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_pipe_out) close(m_pipe_out);
584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_pipe_in = -1;
585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_pipe_out = -1;
586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
587b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu  if (msg_thread_id != 0) {
588b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu    pthread_join(msg_thread_id,NULL);
589b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu  }
590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
591b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu  if (async_thread_id != 0) {
592b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu    pthread_join(async_thread_id,NULL);
593b1eeb59f6e379682ffb46f8005c5a828037f3aa0Ronghua Wu  }
594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_destroy(&m_lock);
5955eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan  pthread_mutex_destroy(&c_lock);
596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  sem_destroy(&m_cmd_lock);
597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.end();
602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
608e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::OMXCntrlProcessMsgCb
610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
611e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL Client callbacks are generated through this routine. The decoder
613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  provides the thread context for this routine.
614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
615e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  ctxt -- Context information related to the self.
617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  id   -- Event identifier. This could be any of the following:
618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          1. Command completion event
619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          2. Buffer done callback event
620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          3. Frame done callback event
621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
622e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned p1; // Parameter - 1
629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned p2; // Parameter - 2
630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned ident;
631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned qsize=0; // qsize
632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec *pThis = (omx_vdec *) ctxt;
633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(!pThis)
635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        __func__);
638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return;
639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  // Protect the shared queue data structure
642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  do
643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Read the message id's from the queue*/
645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&pThis->m_lock);
646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    qsize = pThis->m_cmd_q.m_size;
647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(qsize)
648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      qsize = pThis->m_ftb_q.m_size;
655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (qsize)
656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      qsize = pThis->m_etb_q.m_size;
664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (qsize)
665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&pThis->m_lock);
670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*process message if we have one*/
672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(qsize > 0)
673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      id = ident;
675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      switch (id)
676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EVENT:
678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            switch (p1)
681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_CommandStateSet:
683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = (OMX_STATETYPE) p2;
684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_state);
686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventCmdComplete, p1, p2, NULL);
688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_EventError:
691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                if(p2 == OMX_StateInvalid)
692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_state = (OMX_STATETYPE) p2;
695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                               OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                else if (p2 == OMX_ErrorHardware)
699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   pThis->omx_report_error();
701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                else
703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventError, p2, NULL, NULL );
706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_CommandPortDisable:
710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  break;
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig)
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->in_reconfig = false;
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->drv_ctx.op_buf = pThis->op_buf_rcnfg;
721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  OMX_ERRORTYPE eRet = pThis->set_buffer_req(&pThis->drv_ctx.op_buf);
722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if(eRet !=  OMX_ErrorNone)
723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pThis->omx_report_error();
726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      break;
727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventCmdComplete, p1, p2, NULL );
731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_CommandPortEnable:
733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventCmdComplete, p1, p2, NULL );
736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              default:
739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_EventCmdComplete, p1, p2, NULL );
741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_ETB:
759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         break;
766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_FTB:
768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             pThis->omx_report_error ();
773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_COMMAND:
777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    (OMX_U32)p2,(OMX_PTR)NULL);
779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EBD:
782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count++;
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ?true:false);
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count = 0;
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if ( pThis->empty_buffer_done(&pThis->m_cmp,
803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               pThis->omx_report_error ();
807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!pThis->arbitrary_bytes && pThis->m_inp_err_count > MAX_INPUT_ERROR)
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pThis->omx_report_error ();
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            int64_t *timestamp = (int64_t *)p1;
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p1)
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(*timestamp,
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ?true:false);
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free(timestamp);
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_FBD:
828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (p2 != VDEC_S_SUCCESS)
829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( pThis->fill_buffer_done(&pThis->m_cmp,
834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->input_flush_progress)
844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_input_flush();
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_INPUT_FLUSH_PENDING))
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_INPUT_PORT_INDEX,NULL );
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_COMPONENT_IDLE_PENDING))
871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->output_flush_progress)
873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     if (ioctl (pThis->drv_ctx.video_driver_fd,
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                VDEC_IOCTL_CMD_STOP,NULL ) < 0)
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     {
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       pThis->omx_report_error ();
880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     }
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->output_flush_progress)
895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_output_flush();
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Notify Output Flush done");
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_OUTPUT_PORT_INDEX,NULL );
919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Internal flush complete");
924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,
925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (BITMASK_PRESENT(&pThis->m_flags,
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->post_event(OMX_CommandPortDisable,
930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_CORE_OUTPUT_PORT_INDEX,
931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_COMPONENT_GENERATE_EVENT);
932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    BITMASK_CLEAR (&pThis->m_flags,
933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->input_flush_progress)
941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    if (ioctl (pThis->drv_ctx.video_driver_fd,
944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               VDEC_IOCTL_CMD_STOP,NULL ) < 0)
945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    {
946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pThis->omx_report_error ();
948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    }
949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_START_DONE:
961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n Move to executing");
976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StateExecuting;
979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_EventCmdComplete,OMX_CommandStateSet,
981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_StateExecuting, NULL);
982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else if (BITMASK_PRESENT(&pThis->m_flags,
984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_COMPONENT_PAUSE_PENDING))
985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (ioctl (pThis->drv_ctx.video_driver_fd,
987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           VDEC_IOCTL_CMD_PAUSE,NULL ) < 0)
988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  pThis->omx_report_error ();
991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_PAUSE_DONE:
1002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
1003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
1004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
1005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
1006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
1008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
1009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
1011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
1013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
1014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
1015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
1016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                //Send the callback now
1017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
1018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StatePause;
1019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_StatePause, NULL);
1022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
1023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
1025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_RESUME_DONE:
1033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
1034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
1035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
1036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
1037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
1039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
1040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
1042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
1044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
1045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
1046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
1047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
1048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StateExecuting;
1049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_StateExecuting,NULL);
1052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
1053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
1055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_STOP_DONE:
1063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
1064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
1065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
1066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
1067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
1069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
1070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
1072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
1074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
1075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
1076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
1077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
1078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
1079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StateIdle;
1080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n Move to Idle State");
1081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_EventCmdComplete,OMX_CommandStateSet,
1083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_StateIdle,NULL);
1084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
1085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
109682175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan          if (p2 == OMX_IndexParamPortDefinition && (pThis->start_port_reconfig() != OMX_ErrorNone))
1097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error();
1098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
110082175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            if (pThis->m_cb.EventHandler) {
110182175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan              pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
110282175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan                    OMX_EventPortSettingsChanged, p1, p2, NULL );
110382175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            } else {
110482175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
1107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  format = OMX_InterlaceInterleaveFrameTopFieldFirst;
1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else //unsupported interlace format; raise a error
1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  event = OMX_EventError;
1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->m_cb.EventHandler) {
1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    event, format, 0, NULL );
1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EOS_DONE:
1127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler) {
1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->prev_ts = LLONG_MAX;
1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->rst_prev_ts = true;
1136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
1139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
1140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pThis->omx_report_error ();
1141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
114282175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan
1143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        default:
1144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&pThis->m_lock);
1148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    qsize = pThis->m_cmd_q.m_size;
1149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pThis->m_state != OMX_StatePause)
1150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
1151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&pThis->m_lock);
1152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while(qsize>0);
1154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
115782175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavanvoid omx_vdec::update_resolution(int width, int height)
115882175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan{
115982175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  drv_ctx.video_resolution.frame_height = height;
116082175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  drv_ctx.video_resolution.frame_width = width;
116182175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  drv_ctx.video_resolution.scan_lines = height;
116282175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  drv_ctx.video_resolution.stride = width;
116382175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  rectangle.nLeft = 0;
116482175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  rectangle.nTop = 0;
116582175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  rectangle.nWidth = drv_ctx.video_resolution.frame_width;
116682175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan  rectangle.nHeight = drv_ctx.video_resolution.frame_height;
116782175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan}
1168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1170e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentInit
1172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1173e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Initialize the component.
1175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1176e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  ctxt -- Context information related to the self.
1178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  id   -- Event identifier. This could be any of the following:
1179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          1. Command completion event
1180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          2. Buffer done callback event
1181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          3. Frame done callback event
1182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1183e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
1185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1187e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
1191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
1192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int   alignment = 0,buffer_size = 0;
1193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int fds[2];
1194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int r;
1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STRING device_name = "/dev/msm_vidc_dec";
1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
119765fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan#ifdef _ANDROID_
119865fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan    /*
119965fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan     * turn off frame parsing for Android by default.
120065fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan     * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode
120165fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan     */
120265fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan    arbitrary_bytes = false;
120365fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan#endif
120465fd197dfe55a3516be58a9c4d6c9fac83b9df8cPraveen Chavan
1205b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan  if(!strncmp(role, "OMX.qcom.video.decoder.avc.smoothstreaming",OMX_MAX_STRINGNAME_SIZE)){
1206b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan      ALOGI("smooth streaming role");
1207b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan      m_use_smoothstreaming = true;
1208b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan      role = "OMX.qcom.video.decoder.avc";
1209b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan  }
1210b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan  if(!strncmp(role, "OMX.qcom.video.decoder.avc.smoothstreaming.secure",OMX_MAX_STRINGNAME_SIZE)){
1211b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan      ALOGI("secure smooth streaming role");
1212b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan      m_use_smoothstreaming = true;
1213b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan      role = "OMX.qcom.video.decoder.avc.secure";
1214b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan  }
1215b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan
1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      secure_mode = true;
1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      arbitrary_bytes = false;
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      role = "OMX.qcom.video.decoder.avc";
1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      device_name =  "/dev/msm_vidc_dec_sec";
1221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1222fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1223fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  if (secure_mode) {
1224fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secureDisplay(qService::IQService::START) < 0) {
1225fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      DEBUG_PRINT_HIGH("Sending message to start securing display failed");
1226fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
1227fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  }
1228fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Start of New Playback : role  = %s : DEVICE = %s",
1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        role, device_name);
1231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
1233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.video_driver_fd, errno);
1236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.video_driver_fd == 0){
1238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
1239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.video_driver_fd < 0)
1242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
1244fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      eRet = OMX_ErrorInsufficientResources;
1245fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      goto cleanup;
1246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.frame_rate.fps_denominator = 1;
1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  outputBufferFile1 = fopen (outputfilename, "ab");
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  outputExtradataFile = fopen (ouputextradatafilename, "ab");
1259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
1260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  // Copy the role information which provides the decoder kind
1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  strlcpy(drv_ctx.kind,role,128);
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
1264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_MAX_STRINGNAME_SIZE))
1265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
1267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     OMX_MAX_STRINGNAME_SIZE);
1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.timestamp_adjust = true;
1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
1270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     /*Initialize Start Code for MPEG4*/
1272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     codec_type_parse = CODEC_TYPE_MPEG4;
1273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     m_frame_parser.init_start_codes (codec_type_parse);
1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "m4v");
1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_MAX_STRINGNAME_SIZE))
1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
1282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_MAX_STRINGNAME_SIZE);
1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
1284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingMPEG2;
1285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Initialize Start Code for MPEG2*/
1286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_MPEG2;
1287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "mpg");
1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
1293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         OMX_MAX_STRINGNAME_SIZE))
1294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
1296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_LOW("\n H263 Decoder selected");
1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
1298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     eCompressionFormat = OMX_VIDEO_CodingH263;
1299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     codec_type_parse = CODEC_TYPE_H263;
1300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     m_frame_parser.init_start_codes (codec_type_parse);
1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "263");
1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
1307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         OMX_MAX_STRINGNAME_SIZE))
1308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
1311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
1312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1319fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1320fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
1325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         OMX_MAX_STRINGNAME_SIZE))
1326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1337fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1338fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
1343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1355fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1356fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, \
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)))
1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR ("\n DIVX Decoder selected");
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_5;
1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1376fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1377fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingAVC;
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_H264;
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_nal_length(nal_length);
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "264");
1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingWMV;
1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_VC1;
1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "vc1");
1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
1408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingWMV;
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_VC1;
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "vc1");
1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInvalidComponentName;
1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  inputBufferFile1 = fopen (inputfilename, "ab");
1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (eRet == OMX_ErrorNone)
1428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
1431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
143540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
143640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
143740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.set_color_format(dest_color_format)) {
143840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Setting color format failed");
143940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      eRet = OMX_ErrorInsufficientResources;
144040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Initialize Decoder with codec type and resolution*/
1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.decoder_format;
1444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
1445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ( (eRet == OMX_ErrorNone) &&
1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_CODEC,
1448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (void*)&ioctl_msg) < 0)
1449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set codec type failed");
1452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Set the output format*/
1456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.output_format;
1457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
1458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ( (eRet == OMX_ErrorNone) &&
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
1461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           (void*)&ioctl_msg) < 0)
1462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set output format failed");
1464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1467b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan  if (m_use_smoothstreaming) {
1468b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan      int rc = ioctl(drv_ctx.video_driver_fd,
1469b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan                      VDEC_IOCTL_SET_CONT_ON_RECONFIG);
1470b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan      if(rc < 0) {
1471b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan          DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
1472ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan      } else {
1473ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan          m_smoothstreaming_width = kMaxSmoothStreamingWidth;
1474ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan          m_smoothstreaming_height = kMaxSmoothStreamingHeight;
1475b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan      }
1476b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan  }
1477b0caee6335fe7e04493b2a4f96f205bce4b1d7dePraveen Chavan
1478ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan    if (m_use_smoothstreaming)
1479ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        update_resolution(kMaxSmoothStreamingWidth, kMaxSmoothStreamingHeight);
1480ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan    else
1481ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        update_resolution(176, 144);
1482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.video_resolution;
1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
1485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ( (eRet == OMX_ErrorNone) &&
1487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_PICRES,
1488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           (void*)&ioctl_msg) < 0)
1489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set Resolution failed");
1491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Get the Buffer requirements for input and output ports*/
1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.extradata = 0;
1499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.idr_only_decoding = 0;
1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (eRet == OMX_ErrorNone)
1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = get_buffer_req(&drv_ctx.ip_buf);
1504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (eRet == OMX_ErrorNone)
1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = get_buffer_req(&drv_ctx.op_buf);
1506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_state = OMX_StateLoaded;
1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (eRet == OMX_ErrorNone && !secure_mode)
1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = enable_extradata(DEFAULT_EXTRADATA);
1510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( (codec_type_parse == CODEC_TYPE_VC1) ||
1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (codec_type_parse == CODEC_TYPE_H264)) //add CP check here
1513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //Check if dmx can be disabled
1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_ERRORTYPE eRet = OMX_ErrorNone;
1517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ioctl_msg.out = &drv_ctx.disable_dmx;
1518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT, &ioctl_msg))
1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT");
1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorHardware;
1522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.disable_dmx && !secure_mode)
1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("DMX disable is supported");
1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          int rc = ioctl(drv_ctx.video_driver_fd,
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      VDEC_IOCTL_SET_DISABLE_DMX);
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(rc < 0) {
1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Failed to disable dmx on driver.");
1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.disable_dmx = false;
1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorHardware;
1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.disable_dmx = false;
1539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
1543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_frame_parser.mutils == NULL)
1545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils = new H264_Utils();
1547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_frame_parser.mutils == NULL)
1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet = OMX_ErrorInsufficientResources;
1552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
1556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
1557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nFilledLen = 0;
1558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nOffset = 0;
1559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (h264_scratch.pBuffer == NULL)
1561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
1563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           return OMX_ErrorInsufficientResources;
1564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_frame_parser.mutils->initialize_frame_checking_environment();
1566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
1567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_parser = new h264_stream_parser();
1571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!h264_parser)
1572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
1574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInsufficientResources;
1575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(pipe(fds))
1579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("pipe creation failed\n");
1581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      int temp1[2];
1586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(fds[0] == 0 || fds[1] == 0)
1587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (pipe (temp1))
1589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("pipe creation failed\n");
1591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorInsufficientResources;
1592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //close (fds[0]);
1594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //close (fds[1]);
1595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        fds[0] = temp1 [0];
1596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        fds[1] = temp1 [1];
1597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_pipe_in = fds[0];
1599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_pipe_out = fds[1];
1600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      r = pthread_create(&msg_thread_id,0,message_thread,this);
1601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(r < 0)
1603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
1605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInsufficientResources;
1606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
1608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        r = pthread_create(&async_thread_id,0,async_message_thread,this);
1610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(r < 0)
1611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\n component_init(): async_message_thread creation failed");
1613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorInsufficientResources;
1614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (eRet != OMX_ErrorNone)
1620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Component Init Failed");
1622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
1623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
1624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        NULL);
1625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close (drv_ctx.video_driver_fd);
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_driver_fd = -1;
1628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
1630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
1632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
1635fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1636fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgecleanup:
1637fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1638fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  if (secure_mode && (eRet == OMX_ErrorNone)) {
1639fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secureDisplay(qService::IQService::END) < 0) {
1640fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      DEBUG_PRINT_HIGH("sending message to stop securing display failed");
1641fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
1642fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  }
1643fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
1645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1648e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetComponentVersion
1650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1651e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns the component version.
1653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1654e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  TBD.
1656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1657e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ErrorNone.
1659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1661e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_component_version
1662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     (
1663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_HANDLETYPE hComp,
1664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_STRING componentName,
1665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_VERSIONTYPE* componentVersion,
1666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_VERSIONTYPE* specVersion,
1667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_UUIDTYPE* componentUUID
1668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      )
1669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
1671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
1673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
1674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* TBD -- Return the proper version */
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (specVersion)
1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    specVersion->nVersion = OMX_SPEC_VERSION;
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
1681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1683e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SendCommand
1685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1686e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns zero if all the buffers released..
1688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1689e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
1691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1692e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
1694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1696e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
1697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_COMMANDTYPE cmd,
1698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_U32 param1,
1699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_PTR cmdData
1700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      )
1701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
1703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
1704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
1706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
1707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
1710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
1712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "to invalid port: %d", param1);
1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadPortIndex;
1714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_wait(&m_cmd_lock);
1717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n send_command: Command Processed\n");
1718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
1719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1722e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SendCommand
1724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1725e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns zero if all the buffers released..
1727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1728e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
1730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1731e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
1733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1735e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
1736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_IN OMX_COMMANDTYPE cmd,
1737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_IN OMX_U32 param1,
1738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_IN OMX_PTR cmdData
1739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            )
1740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
1742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
1743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int bFlag = 1,sem_posted = 0;
1744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
1746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
1747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_state, eState);
1748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(cmd == OMX_CommandStateSet)
1750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
1752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
1753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is Loaded */
1755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateLoaded)
1757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateIdle)
1759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //if all buffers are allocated or all ports disabled
1761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(allocate_done() ||
1762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
1763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
1765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
1767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
1769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
1770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          // Skip the event notification
1771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
1772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Loaded */
1775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateLoaded)
1776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
1778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,\
1779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
1781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to WaitForResources */
1783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateWaitForResources)
1784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Since error is None , we will post an event
1786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           at the end of this function definition */
1787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
1788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Executing */
1790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateExecuting)
1791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
1793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
1796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Pause */
1798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StatePause)
1799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
1801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
1804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Invalid */
1806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateInvalid)
1807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
1809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
1811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
1813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
1815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          eState);
1816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadParameter;
1817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is IDLE */
1822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateIdle)
1824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateLoaded)
1826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(release_done())
1828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          /*
1830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             Since error is None , we will post an event at the end
1831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             of this function definition
1832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          */
1833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
1834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
1836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
1838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
1839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          // Skip the event notification
1840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
1841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to Executing */
1844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateExecuting)
1845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
1848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bFlag = 0;
1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    NULL) < 0)
1851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
1853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
1854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorHardware;
1855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to Idle */
1858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateIdle)
1859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
1861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,\
1862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
1864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to WaitForResources */
1866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateWaitForResources)
1867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
1869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
1872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Idle to Pause */
1874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StatePause)
1875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         /*To pause the Video core we need to start the driver*/
1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
1878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    NULL) < 0)
1879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
1881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           omx_report_error ();
1882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           eRet = OMX_ErrorHardware;
1883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         else
1885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
1888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           bFlag = 0;
1889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to Invalid */
1892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateInvalid)
1893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
1895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
1897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
1899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
1901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadParameter;
1902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /******************************/
1906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is Executing */
1907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /******************************/
1908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateExecuting)
1909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
1911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Idle */
1912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       if(eState == OMX_StateIdle)
1913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         /* Since error is None , we will post an event
1915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         at the end of this function definition
1916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         */
1917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
1918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
1919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         if(!sem_posted)
1920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_posted = 1;
1922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_post (&m_cmd_lock);
1923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           execute_omx_flush(OMX_ALL);
1924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         bFlag = 0;
1926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Paused */
1928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StatePause)
1929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_LOW("\n PAUSE Command Issued");
1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
1932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    NULL) < 0)
1933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_ERROR("\n Error In Pause State");
1935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           post_event(OMX_EventError,OMX_ErrorHardware,\
1936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      OMX_COMPONENT_GENERATE_EVENT);
1937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           eRet = OMX_ErrorHardware;
1938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         else
1940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n");
1943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           bFlag = 0;
1944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Loaded */
1947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateLoaded)
1948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
1950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_COMPONENT_GENERATE_EVENT);
1952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorIncorrectStateTransition;
1953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to WaitForResources */
1955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateWaitForResources)
1956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
1958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_COMPONENT_GENERATE_EVENT);
1960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorIncorrectStateTransition;
1961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Executing */
1963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateExecuting)
1964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
1966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,OMX_ErrorSameState,\
1967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_COMPONENT_GENERATE_EVENT);
1968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorSameState;
1969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Invalid */
1971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateInvalid)
1972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
1974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorInvalidState;
1976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else
1978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
1980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorBadParameter;
1981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is Pause  */
1985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StatePause)
1987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to Executing */
1989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateExecuting)
1990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Pause --> Executing \n");
1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
1993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   NULL) < 0)
1994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
1996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          post_event(OMX_EventError,OMX_ErrorHardware,\
1997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT);
1998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorHardware;
1999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
2001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
2003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
2004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          post_event (NULL,VDEC_S_SUCCESS,\
2005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      OMX_COMPONENT_GENERATE_RESUME_DONE);
2006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
2007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to Idle */
2010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateIdle)
2011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Since error is None , we will post an event
2013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        at the end of this function definition */
2014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Pause --> Idle \n");
2015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
2016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         if(!sem_posted)
2017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
2018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_posted = 1;
2019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_post (&m_cmd_lock);
2020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           execute_omx_flush(OMX_ALL);
2021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
2022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         bFlag = 0;
2023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to loaded */
2025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateLoaded)
2026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
2028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
2031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to WaitForResources */
2033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateWaitForResources)
2034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
2036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
2039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to Pause */
2041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StatePause)
2042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
2044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,\
2045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
2047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Pause to Invalid */
2049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateInvalid)
2050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
2052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
2054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
2058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadParameter;
2059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     /***************************/
2062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is WaitForResources  */
2063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
2064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateWaitForResources)
2065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Loaded */
2067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateLoaded)
2068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Since error is None , we will post an event
2070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        at the end of this function definition */
2071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
2072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to WaitForResources */
2074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (eState == OMX_StateWaitForResources)
2075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
2077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,
2078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
2080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Executing */
2082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateExecuting)
2083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
2085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
2088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Pause */
2090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StatePause)
2091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
2093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
2096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Invalid */
2098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateInvalid)
2099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
2101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
2103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Loaded -
2105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      is NOT tested by Khronos TS */
2106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
2111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadParameter;
2112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /********************************/
2115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* Current State is Invalid */
2116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*******************************/
2117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if(m_state == OMX_StateInvalid)
2118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* State Transition from Inavlid to any state */
2120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
2121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  || OMX_StateIdle || OMX_StateExecuting
2122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  || OMX_StatePause || OMX_StateInvalid))
2123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
2125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      post_event(OMX_EventError,OMX_ErrorInvalidState,\
2126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 OMX_COMPONENT_GENERATE_EVENT);
2127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInvalidState;
2128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if (cmd == OMX_CommandFlush)
2131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
2133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        "with param1: %d", param1);
2134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
2137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
2141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!sem_posted){
2143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      sem_posted = 1;
2144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Set the Semaphore");
2145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      sem_post (&m_cmd_lock);
2146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      execute_omx_flush(param1);
2147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bFlag = 0;
2149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if ( cmd == OMX_CommandPortEnable)
2151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
2153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        "with param1: %d", param1);
2154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_inp_bEnabled = OMX_TRUE;
2157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if( (m_state == OMX_StateLoaded &&
2159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            || allocate_input_done())
2161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
2163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT);
2164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
2166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
2169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          // Skip the event notification
2170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
2171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("\n Enable output Port command recieved");
2176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          m_out_bEnabled = OMX_TRUE;
2177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if( (m_state == OMX_StateLoaded &&
2179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              || (allocate_output_done()))
2181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
2184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
2187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
2190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              // Skip the event notification
2191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              bFlag = 0;
2192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if (cmd == OMX_CommandPortDisable)
2196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
2198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          "with param1: %d", param1);
2199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          m_inp_bEnabled = OMX_FALSE;
2202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              && release_input_done())
2204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
2207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
2209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
2211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             {
2213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               if(!sem_posted)
2214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               {
2215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 sem_posted = 1;
2216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 sem_post (&m_cmd_lock);
2217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               }
2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
2219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             }
2220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             // Skip the event notification
2222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             bFlag = 0;
2223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          m_out_bEnabled = OMX_FALSE;
2228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("\n Disable output Port command recieved");
2229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              && release_output_done())
2231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
2234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
2236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
2237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
2238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
2240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (!sem_posted)
2241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
2242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                sem_posted = 1;
2243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                sem_post (&m_cmd_lock);
2244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
2245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
2246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
2247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
2248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Skip the event notification
2249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            bFlag = 0;
2250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
2252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
2255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
2257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorNotImplemented;
2258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(eRet == OMX_ErrorNone && bFlag)
2260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
2262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(!sem_posted)
2264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_post(&m_cmd_lock);
2266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
2269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
2272e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ExecuteOmxFlush
2274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2275e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Executes the OMX flush.
2277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2278e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  flushtype - input flush(1)/output flush(0)/ both.
2280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2281e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
2288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  enum vdec_bufferflush flush_dir;
2289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (flushType)
2291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_INPUT_PORT_INDEX:
2293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_INPUT;
2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_OUTPUT_PORT_INDEX:
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
2299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_ALL;
2304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &flush_dir;
2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < 0)
2308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = false;
2311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*=========================================================================
2315e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION : execute_output_flush
2316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2317e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Executes the OMX flush at OUTPUT PORT.
2319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2320e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
2322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2323e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly==========================================================================*/
2326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p1 = 0; // Parameter - 1
2329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p2 = 0; // Parameter - 2
2330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      ident = 0;
2331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = true;
2332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Generate FBD for all Buffers in the FTBq*/
2334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_lock(&m_lock);
2335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Initiate Output Flush");
2336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (m_ftb_q.m_size)
2337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
2339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       m_ftb_q.m_size,pending_output_buffers);
2340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.pop_entry(&p1,&p2,&ident);
2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
234240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if(ident == m_fill_output_msg)
2343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pending_output_buffers++;
234540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (ident == OMX_COMPONENT_GENERATE_FBD)
2348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_unlock(&m_lock);
2353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_flush_progress = false;
2354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
2356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
2361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*=========================================================================
2364e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION : execute_input_flush
2365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2366e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Executes the OMX flush at INPUT PORT.
2368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2369e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
2371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2372e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly==========================================================================*/
2375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned       i =0;
2378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p1 = 0; // Parameter - 1
2379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p2 = 0; // Parameter - 2
2380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      ident = 0;
2381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = true;
2382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Generate EBD for all Buffers in the ETBq*/
2384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
2385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_lock(&m_lock);
2387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
2388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (m_etb_q.m_size)
2389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.pop_entry(&p1,&p2,&ident);
2391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
2395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2397e77c68a64ef47b33ae1ae6f5a45152420336b36aHaynes Mathew George    else if(ident == OMX_COMPONENT_GENERATE_ETB)
2398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pending_input_buffers++;
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
2402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
2403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (ident == OMX_COMPONENT_GENERATE_EBD)
2405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p1);
2408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  time_stamp_dts.flush_timestamp();
2412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Check if Heap Buffers are to be flushed*/
2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes && !(codec_config_flag))
2414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
2416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    h264_scratch.nFilledLen = 0;
2417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nal_count = 0;
2418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    look_ahead_nal = false;
2419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    frame_count = 0;
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
2421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
2424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Initialize parser");
2425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_frame_parser.mutils)
2426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_frame_parser.mutils->initialize_frame_checking_environment();
2428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    while (m_input_pending_q.m_size)
2431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_input_pending_q.pop_entry(&p1,&p2,&ident);
2433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
2434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame)
2437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
2439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
2440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame)
2443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen = 0;
2445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
2446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame = NULL;
2447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_frame_parser.flush();
2449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (codec_config_flag)
2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       "is not sent to the driver yet");
2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_unlock(&m_lock);
2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  input_flush_progress = false;
2457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes)
2458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_timestamp_list.reset_ts_list();
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
2469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
2474e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SendCommandEvent
2476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2477e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Send the event to decoder pipe.  This is needed to generate the callbacks
2479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  in decoder thread context.
2480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2481e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
2483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2484e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::post_event(unsigned int p1,
2489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          unsigned int p2,
2490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          unsigned int id)
2491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet      =                      false;
2493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_lock(&m_lock);
2496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
249740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (id == m_fill_output_msg ||
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      id == OMX_COMPONENT_GENERATE_FBD)
2499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.insert_entry(p1,p2,id);
2501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (id == OMX_COMPONENT_GENERATE_ETB ||
2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_EBD ||
2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.insert_entry(p1,p2,id);
2507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
2509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.insert_entry(p1,p2,id);
2511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet = true;
2514e77c68a64ef47b33ae1ae6f5a45152420336b36aHaynes Mathew George  DEBUG_PRINT_LOW("\n Value of this pointer in post_event 0x%x", p2);
2515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  post_message(this, id);
2516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_unlock(&m_lock);
2518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!profileLevelType)
2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(profileLevelType->nPortIndex == 0) {
2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (profileLevelType->nProfileIndex == 1)
2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 2)
2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            profileLevelType->nProfileIndex);
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
2558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!profileLevelType)
2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(profileLevelType->nPortIndex == 0) {
2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (profileLevelType->nProfileIndex == 1)
2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 2)
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            profileLevelType->nProfileIndex);
2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
2686e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetParameter
2688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2689e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Get Parameter method implementation
2691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2692e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
2694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2695e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Error None if successful.
2697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2699e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_INDEXTYPE paramIndex,
2701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_INOUT OMX_PTR     paramData)
2702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("get_parameter: \n");
2706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
2707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
2709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
2710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(paramData == NULL)
2712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
2714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorBadParameter;
2715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch(paramIndex)
2717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPortDefinition:
2719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
2722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = update_portdef(portDefn);
2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eRet == OMX_ErrorNone)
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_port_def = *portDefn;
2726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
2727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoInit:
2729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_PORT_PARAM_TYPE *portParamType =
2731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              (OMX_PORT_PARAM_TYPE *) paramData;
2732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
2733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nSize = sizeof(portParamType);
2736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nPorts           = 2;
2737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nStartPortNumber = 0;
2738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
2739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoPortFormat:
2741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
2743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
2744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
2745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
2747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt->nSize             = sizeof(portFmt);
2748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (0 == portFmt->nPortIndex)
2750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (0 == portFmt->nIndex)
2752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
2754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              portFmt->eCompressionFormat = eCompressionFormat;
2755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
2757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
2759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              " NoMore compression formats\n");
2760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet =  OMX_ErrorNoMore;
2761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (1 == portFmt->nPortIndex)
2764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
2767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (0 == portFmt->nIndex)
2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if(1 == portFmt->nIndex)
2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
2771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(0 == portFmt->nIndex)
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
2776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
2777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
277840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        else if (1 == portFmt->nIndex) {
27793072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan          portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
27803072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan        } else if (2 == portFmt->nIndex) {
278140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
278240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        }
2783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
2784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
2786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  " NoMore Color formats\n");
2787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           eRet =  OMX_ErrorNoMore;
2788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2789d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_HIGH("get_parameter: color-format=%x @ index=%d", portFmt->eColorFormat, portFmt->nIndex);
2790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
2794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          (int)portFmt->nPortIndex);
2795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
2796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
2798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Component should support this port definition*/
2800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamAudioInit:
2801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_PORT_PARAM_TYPE *audioPortParamType =
2803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                              (OMX_PORT_PARAM_TYPE *) paramData;
2804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
2805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nSize = sizeof(audioPortParamType);
2807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nPorts           = 0;
2808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nStartPortNumber = 0;
2809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Component should support this port definition*/
2812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamImageInit:
2813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_PORT_PARAM_TYPE *imagePortParamType =
2815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                              (OMX_PORT_PARAM_TYPE *) paramData;
2816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
2817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nSize = sizeof(imagePortParamType);
2819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nPorts           = 0;
2820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nStartPortNumber = 0;
2821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Component should support this port definition*/
2825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamOtherInit:
2826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
2828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          paramIndex);
2829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet =OMX_ErrorUnsupportedIndex;
2830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamStandardComponentRole:
2833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_PARAM_COMPONENTROLETYPE *comp_role;
2835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
2836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
2837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        comp_role->nSize = sizeof(*comp_role);
2838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
2840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
2842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_MAX_STRINGNAME_SIZE);
2843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Added for parameter test */
2846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPriorityMgmt:
2847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            OMX_PRIORITYMGMTTYPE *priorityMgmType =
2850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                             (OMX_PRIORITYMGMTTYPE *) paramData;
2851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
2852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
2853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            priorityMgmType->nSize = sizeof(priorityMgmType);
2854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Added for parameter test */
2858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamCompBufferSupplier:
2859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
2861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
2862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
2863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            bufferSupplierType->nSize = sizeof(bufferSupplierType);
2865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
2866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(0 == bufferSupplierType->nPortIndex)
2867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if (1 == bufferSupplierType->nPortIndex)
2869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
2871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                eRet = OMX_ErrorBadPortIndex;
2872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoAvc:
2877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
2879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        paramIndex);
2880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoH263:
2883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
2885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        paramIndex);
2886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoMpeg4:
2889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
2891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        paramIndex);
2892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoMpeg2:
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              paramIndex);
2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoProfileLevelQuerySupported:
2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = get_supported_profile_level_for_720p(profileLevelType);
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = get_supported_profile_level_for_1080p(profileLevelType);
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(secure_mode) {
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                      GRALLOC_USAGE_PRIVATE_CP_BUFFER | GRALLOC_USAGE_PRIVATE_UNCACHED);
2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                } else {
2924377fd1951967c0cd69be84882a0c1adc9134e75cPraveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (MAX_RES_720P) ||  defined (MAX_RES_1080P_EBI)
2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P
2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else {
2934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
2935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorBadParameter;
2936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =OMX_ErrorUnsupportedIndex;
2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_width,
2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_height,
2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.stride,
2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.scan_lines);
2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((params == NULL) ||
2966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer == NULL) ||
2967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer->handle == NULL) ||
2968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      !m_enable_android_native_buffers)
2969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
29733d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
29743d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George    if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
29753d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
29763d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                          " expected %u, got %lu",
29773d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                          drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
29783d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        return OMX_ErrorBadParameter;
29793d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George    }
29803d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
2981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
2982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
2983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
2984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer = (OMX_U8*)mmap(0, handle->size,
2985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
2986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(buffer == MAP_FAILED) {
2987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
2988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    return OMX_ErrorInsufficientResources;
2989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2999e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::Setparameter
3001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3002e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Set Parameter method implementation.
3004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3005e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3008e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
3010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3012e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
3013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_INDEXTYPE paramIndex,
3014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_PTR        paramData)
3015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
3017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
3020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
3022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
3023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(paramData == NULL)
3025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
3027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         return OMX_ErrorBadParameter;
3028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((m_state != OMX_StateLoaded) &&
3030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
3031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_out_bEnabled == OMX_TRUE) &&
3032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
3033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_inp_bEnabled == OMX_TRUE)) {
3034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
3035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
3036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch(paramIndex)
3039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPortDefinition:
3041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
3043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
3044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
3045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //been called.
3046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
3047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             (int)portDefn->format.video.nFrameHeight,
3048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             (int)portDefn->format.video.nFrameWidth);
3049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(OMX_DirOutput == portDefn->eDir)
3050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
305157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          eRet = update_color_format(portDefn->format.video.eColorFormat);
305257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          if (eRet != OMX_ErrorNone) {
305357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George            DEBUG_PRINT_ERROR("\n Setparam: color format failed for %u",
305457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George                              portDefn->format.video.eColorFormat);
305557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George            break;
305657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          }
305757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
3058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_display_id = portDefn->format.video.pNativeWindow;
305940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          unsigned int buffer_size;
306040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          if (!client_buffers.get_buffer_req(buffer_size)) {
306140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
306240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            eRet = OMX_ErrorBadParameter;
306340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          } else {
306440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
306540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                 portDefn->nBufferSize >=  buffer_size)
306640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George              {
3067c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                // disallow more than 2 extrabuffers when we are in smoothstreaming mode
3068c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                // and output memory comes from a budgeted carveout
3069c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                if (m_use_smoothstreaming && secure_mode &&
3070c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                    (portDefn->nBufferCountActual > drv_ctx.op_buf.actualcount + 2)) {
3071c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                    ALOGI("NOTE: rejecting client's buffer-count %d v/s actual %d",
3072c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                            portDefn->nBufferCountActual, drv_ctx.op_buf.actualcount);
3073c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                    eRet = OMX_ErrorBadParameter;
3074c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                    break;
3075c4621b88c8287714ce911fabcbd22494d4f24869Praveen Chavan                }
307640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
307740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
307840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                eRet = set_buffer_req(&drv_ctx.op_buf);
307940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                if (eRet == OMX_ErrorNone)
308040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                    m_port_def = *portDefn;
308140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            }
308240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            else
3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
308440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                DEBUG_PRINT_HIGH("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
308540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
308640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  portDefn->nBufferCountActual, portDefn->nBufferSize);
308740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                eRet = OMX_ErrorBadParameter;
308840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            }
3089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(OMX_DirInput == portDefn->eDir)
3092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((portDefn->format.video.xFramerate >> 16) > 0 &&
3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Frame rate only should be set if this is a "known value" or to
3097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // activate ts prediction logic (arbitrary mode only) sending input
3098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // timestamps with max value (LLONG_MAX).
3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %d",
3100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             portDefn->format.video.xFramerate >> 16);
3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          drv_ctx.frame_rate.fps_denominator);
3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!drv_ctx.frame_rate.fps_numerator)
3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = 30;
3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(drv_ctx.frame_rate.fps_denominator)
3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = (int)
3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_denominator = 1;
3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      drv_ctx.frame_rate.fps_numerator;
3114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            ioctl_msg.in = &drv_ctx.frame_rate;
3115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
3116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       (void*)&ioctl_msg) < 0)
3117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
3119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
3121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             frm_int, drv_ctx.frame_rate.fps_numerator /
3122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (float)drv_ctx.frame_rate.fps_denominator);
3123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
3125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(drv_ctx.video_resolution.frame_height !=
3126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameHeight ||
3127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.video_resolution.frame_width  !=
3128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameWidth)
3129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameWidth,
3132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameHeight);
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if (portDefn->format.video.nFrameHeight != 0x0 &&
3134ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     portDefn->format.video.nFrameWidth != 0x0) {
3135ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                 if (m_use_smoothstreaming &&
3136ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                         ((portDefn->format.video.nFrameHeight * portDefn->format.video.nFrameWidth) <
3137ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                         (m_smoothstreaming_height * m_smoothstreaming_width))) {
3138ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
3139ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     update_resolution(m_smoothstreaming_width, m_smoothstreaming_height);
3140ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     DEBUG_PRINT_HIGH("NOTE: Setting initial resolution [%u x %u] in"
3141ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                             "smothstreaming mode [%u x %u]",
3142ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                              portDefn->format.video.nFrameWidth, portDefn->format.video.nFrameHeight,
3143ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                              drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height);
3144ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                 } else {
3145ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     update_resolution(portDefn->format.video.nFrameWidth,
3146ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     portDefn->format.video.nFrameHeight);
3147ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                 }
3148ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                 ioctl_msg.in = &drv_ctx.video_resolution;
3149ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                 ioctl_msg.out = NULL;
3150ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                 if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
3151ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                         (void*)&ioctl_msg) < 0) {
3152ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     DEBUG_PRINT_ERROR("\n Set Resolution failed");
3153ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     eRet = OMX_ErrorUnsupportedSetting;
3154ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                 } else
3155ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                     eRet = get_buffer_req(&drv_ctx.op_buf);
3156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
3157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
3159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
3160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
3162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
3163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = set_buffer_req(&drv_ctx.ip_buf);
3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
3166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
3167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n",
3168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
3169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->nBufferCountActual, portDefn->nBufferSize);
3170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorBadParameter;
3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (portDefn->eDir ==  OMX_DirMax)
3174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
3176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      (int)portDefn->nPortIndex);
3177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorBadPortIndex;
3178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoPortFormat:
3182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
3184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
3185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
3186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              portFmt->eColorFormat);
3187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(1 == portFmt->nPortIndex)
318957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          eRet = update_color_format(portFmt->eColorFormat);
3190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
319157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      DEBUG_PRINT_HIGH("Set_parameter: OMX_IndexParamVideoPortFormat: "
319257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          "nPortIndex (%d), nIndex (%d), eCompressionFormat (0x%x), "
319357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          "eColorFormat (0x%x), xFramerate (0x%x)", (int)portFmt->nPortIndex,
319457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          (int)portFmt->nIndex, (int)portFmt->eCompressionFormat,
319557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          (int)portFmt->eColorFormat, (int)portFmt->xFramerate);
3196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexPortDefn:
3200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
3202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
3203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
3204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            portFmt->nFramePackingFormat);
3205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Input port */
3207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (portFmt->nPortIndex == 0)
3208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
3210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(secure_mode) {
3212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                arbitrary_bytes = false;
3213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
3214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorUnsupportedSetting;
3215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
3216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               arbitrary_bytes = true;
3217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes enabled");
3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if (portFmt->nFramePackingFormat ==
3221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
3222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               arbitrary_bytes = false;
3224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes disabled");
3225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
3227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n",
3229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    portFmt->nFramePackingFormat);
3230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                eRet = OMX_ErrorUnsupportedSetting;
3231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
3234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
3237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
3238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_mem_region_smi = OMX_TRUE;
3241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_use_output_pmem = OMX_TRUE;
3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     case OMX_IndexParamStandardComponentRole:
3252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     {
3253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_PARAM_COMPONENTROLETYPE *comp_role;
3254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
3255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
3256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       comp_role->cRole);
3257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if((m_state == OMX_StateLoaded)&&
3259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
3260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_LOW("Set Parameter called in valid state");
3262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
3264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             return OMX_ErrorIncorrectStateOperation;
3267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
3274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
3286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet = OMX_ErrorUnsupportedSetting;
3291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
3298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
3310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
3312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorUnsupportedSetting;
3315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
3319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
3320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  )
3321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
3328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    )
3338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
3340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
3342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
3350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
3352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               eRet = OMX_ErrorInvalidComponentName;
3353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     }
3356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPriorityMgmt:
3358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(m_state != OMX_StateLoaded)
3360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               return OMX_ErrorIncorrectStateOperation;
3363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
3365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
3366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              priorityMgmtype->nGroupID);
3367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
3369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             priorityMgmtype->nGroupPriority);
3370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
3372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
3375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamCompBufferSupplier:
3378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
3380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
3381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bufferSupplierType->eBufferSupplier);
3382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
3383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
3384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             else
3386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             eRet = OMX_ErrorBadPortIndex;
3388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoAvc:
3393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
3395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoH263:
3399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
3401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoMpeg4:
3405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
3407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoMpeg2:
3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       case OMX_QcomIndexParamVideoDecoderPictureOrder:
3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pictureOrder->eOutputPictureOrder);
3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
3424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DISPLAY;
3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DECODE;
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  time_stamp_dts.set_timestamp_reorder_mode(false);
3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorBadParameter;
3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (drv_ctx.idr_only_decoding)
3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (pictureOrder->eOutputPictureOrder != QOMX_VIDEO_DECODE_ORDER)
3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_HIGH("only decode order is supported for thumbnail mode");
3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      eRet = OMX_ErrorBadParameter;
3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
3439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.picture_order = pic_order;
3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ioctl_msg.in = &drv_ctx.picture_order;
3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ioctl_msg.out = NULL;
3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (void*)&ioctl_msg) < 0)
3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("\n Set picture order failed");
3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      eRet = OMX_ErrorUnsupportedSetting;
3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamConcealMBMapExtraData:
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
3469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       break;
3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamInterlaceExtraData:
3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamH264TimeInfo:
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoDivx:
3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((divXType) && (divXType->eFormat == QOMX_VIDEO_DIVXFormat311)) {
3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: DivX 3.11 not supported in 7x30 core.");
3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexPlatformPvt:
3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_pvt_entry_pmem = OMX_TRUE;
3516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_use_output_pmem = OMX_TRUE;
3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.idr_only_decoding = 1;
3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          int rc = ioctl(drv_ctx.video_driver_fd,
3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      VDEC_IOCTL_SET_IDR_ONLY_DECODING);
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(rc < 0) {
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
3534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorHardware;
3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (eRet == OMX_ErrorNone)
3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set decode order for thumbnail mode");
3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.picture_order = VDEC_ORDER_DECODE;
3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ioctl_msg.in = &drv_ctx.picture_order;
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ioctl_msg.out = NULL;
3543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (void*)&ioctl_msg) < 0)
3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("\n Set picture order failed");
3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorUnsupportedSetting;
3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamIndexExtraDataType:
3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
3558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->bEnabled == OMX_TRUE) &&
3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->nPortIndex == 1))
3561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
3564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              // Set smooth streaming parameter
3565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              int rc = ioctl(drv_ctx.video_driver_fd,
3566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            VDEC_IOCTL_SET_CONT_ON_RECONFIG);
3567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(rc < 0) {
3568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorHardware;
3570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
3574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Need to allow following two set_parameters even in Idle
3578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * state. This is ANDROID architecture which is not in sync
3579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * with openmax standard. */
3580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
3581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
3583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(enableNativeBuffers) {
3584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_enable_android_native_buffers = enableNativeBuffers->enable;
3585d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan              client_buffers.enable_native_buffers(m_enable_android_native_buffers);
3586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
3590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = use_android_native_buffer(hComp, paramData);
3592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamEnableTimeStampReorder:
3596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
3598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) {
3599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE) {
3600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              frm_int =0;
3601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              time_stamp_dts.set_timestamp_reorder_mode(true);
3602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            time_stamp_dts.set_timestamp_reorder_mode(false);
3605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
3606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          time_stamp_dts.set_timestamp_reorder_mode(false);
3607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE)
3608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3614ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
3615ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
36168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamVideoAdaptivePlaybackMode:
3617ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        {
3618ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            DEBUG_PRINT_LOW("set_parameter: "
36198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "OMX_QcomIndexParamVideoAdaptivePlaybackMode");
3620ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            PrepareForAdaptivePlaybackParams* adaptivePlaybackParams =
3621ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    (PrepareForAdaptivePlaybackParams *) paramData;
3622ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            if (adaptivePlaybackParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
3623ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                if (!adaptivePlaybackParams->bEnable) {
3624ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    return OMX_ErrorNone;
3625ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                }
3626ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                if (adaptivePlaybackParams->nMaxFrameWidth > kMaxSmoothStreamingWidth
3627ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        || adaptivePlaybackParams->nMaxFrameHeight > kMaxSmoothStreamingHeight) {
3628ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    DEBUG_PRINT_ERROR("Adaptive playback request exceeds max supported "
3629ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            "resolution : [%d x %d] vs [%d x %d]",
3630ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                             adaptivePlaybackParams->nMaxFrameWidth,
3631ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                             adaptivePlaybackParams->nMaxFrameHeight,
3632ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                             kMaxSmoothStreamingWidth, kMaxSmoothStreamingHeight);
3633ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    eRet = OMX_ErrorBadParameter;
3634ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                } else {
3635ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    int rc = ioctl(drv_ctx.video_driver_fd,
3636ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            VDEC_IOCTL_SET_CONT_ON_RECONFIG);
3637ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    if (rc < 0) {
3638ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3639ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        eRet = OMX_ErrorInsufficientResources;
3640ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    } else {
3641ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        update_resolution(adaptivePlaybackParams->nMaxFrameWidth,
3642ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                adaptivePlaybackParams->nMaxFrameHeight);
3643ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
3644ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        ioctl_msg.in = &drv_ctx.video_resolution;
3645ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        ioctl_msg.out = NULL;
3646ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
3647ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_PICRES,
3648ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                (void*)&ioctl_msg) < 0) {
3649ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            DEBUG_PRINT_ERROR("Adaptive-playback: Set Resolution failed");
3650ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            eRet = OMX_ErrorInsufficientResources;
3651ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        } else {
3652ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            eRet = get_buffer_req(&drv_ctx.op_buf);
3653ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            if (eRet != OMX_ErrorNone) {
3654ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                DEBUG_PRINT_ERROR("get_buffer_req(op_buf) failed!!");
3655ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            } else {
3656ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                DEBUG_PRINT_ERROR("Enabling Adaptive playback for %d x %d",
3657ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                        adaptivePlaybackParams->nMaxFrameWidth,
3658ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                        adaptivePlaybackParams->nMaxFrameHeight);
3659ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                m_use_smoothstreaming = true;
3660ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                m_smoothstreaming_width = adaptivePlaybackParams->nMaxFrameWidth;
3661ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                                m_smoothstreaming_height = adaptivePlaybackParams->nMaxFrameHeight;
3662ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                            }
3663ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        }
3664ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    }
3665ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                }
3666ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            } else {
3667ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                DEBUG_PRINT_ERROR("Prepare for adaptive playback supported only "
3668ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                        "on output port");
3669ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                eRet = OMX_ErrorBadParameter;
3670ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            }
3671ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        }
3672ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        break;
3673ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan#endif
3674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    default:
3675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
3677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorUnsupportedIndex;
3678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
3681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3684e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetConfig
3686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3687e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Get Config Method implementation.
3689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3690e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3693e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
3695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3697e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
3698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_INDEXTYPE configIndex,
3699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_INOUT OMX_PTR     configData)
3700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_state == OMX_StateInvalid)
3704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     return OMX_ErrorInvalidState;
3707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch (configIndex)
3710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexConfigInterlaced:
3712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
3714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
3715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (configFmt->nPortIndex == 1)
3716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (configFmt->nIndex == 0)
3718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
3720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (configFmt->nIndex == 1)
3722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType =
3724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
3725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (configFmt->nIndex == 2)
3727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType =
3729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
3730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
3732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
3734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            " NoMore Interlaced formats\n");
3735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorNoMore;
3736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
3740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
3742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        (int)configFmt->nPortIndex);
3743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
3744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
3748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
3751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
3752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
3753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (void)(ioctl(drv_ctx.video_driver_fd,
3754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
3755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_QcomIndexConfigVideoFramePackingArrangement:
3758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
3760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
3762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
3763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_pack_data(configFmt);
3764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
3766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_QCOM_EXTRADATA_FRAMEINFO *extradata =
3774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_QCOM_EXTRADATA_FRAMEINFO *) configData;
3775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_extradata == NULL){
3777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("get_config: m_extradata not set. "
3778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            "Aspect Ratio information missing!!");
3779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        extradata->aspectRatio.aspectRatioX =
3782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_extradata->aspectRatio.aspectRatioX;
3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         extradata->aspectRatio.aspectRatioY =
3784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_extradata->aspectRatio.aspectRatioY;
3785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
378882175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan    case OMX_IndexConfigCommonOutputCrop:
378982175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan    {
379082175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan      OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
379182175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan      memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
379282175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan      break;
379382175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan    }
3794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    default:
3796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
3798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadParameter;
3799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
3804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3807e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SetConfig
3809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3810e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Set Config method implementation
3812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3813e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3816e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
3818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3819e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
3820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_INDEXTYPE configIndex,
3821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_PTR        configData)
3822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
3824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
3827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
3830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_VIDEO_CONFIG_NALSIZE *pNal;
3831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Set Config Called");
3833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_state == OMX_StateExecuting)
3835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
3837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     return ret;
3838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (configIndex == OMX_IndexVendorVideoExtraData)
3841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
3843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
3844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
3845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
3847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U32 extra_size;
3848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Parsing done here for the AVC atom is definitely not generic
3849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Currently this piece of code is working, but certainly
3850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // not tested with all .mp4 files.
3851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Incase of failure, we might need to revisit this
3852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // for a generic piece of code.
3853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Retrieve size of NAL length field
3855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // byte #4 contains the size of NAL lenght field
3856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      nal_length = (config->pData[4] & 0x03) + 1;
3857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      extra_size = 0;
3859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (nal_length > 2)
3860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
3862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        extra_size = (nal_length - 2) * 2;
3863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // SPS starts from byte #6
3866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
3867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 *pDestBuf;
3868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nPortIndex = config->nPortIndex;
3869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // minus 6 --> SPS starts from byte #6
3871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // minus 1 --> picture param set byte to be ignored from avcatom
3872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
3873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
3874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U32 len;
3875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 index = 0;
3876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // case where SPS+PPS is sent as part of set_config
3877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pDestBuf = m_vendor_config.pData;
3878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
3880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.nPortIndex,
3881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.nDataSize,
3882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.pData);
3883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      while (index < 2)
3884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        uint8 *psize;
3886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = *pSrcBuf;
3887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = len << 8;
3888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len |= *(pSrcBuf + 1);
3889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psize = (uint8 *) & len;
3890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
3891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        for (int i = 0; i < nal_length; i++)
3892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pDestBuf[i] = psize[nal_length - 1 - i];
3894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //memcpy(pDestBuf,pSrcBuf,(len+2));
3896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pDestBuf += len + nal_length;
3897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pSrcBuf += len + 2;
3898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        index++;
3899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pSrcBuf++;   // skip picture param set
3900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = 0;
3901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
3905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nPortIndex = config->nPortIndex;
3907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nDataSize = config->nDataSize;
3908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
3909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
3910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
3912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(m_vendor_config.pData)
3914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            free(m_vendor_config.pData);
3916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData = NULL;
3917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = 0;
3918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (((*((OMX_U32 *) config->pData)) &
3921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             VC1_SP_MP_START_CODE_MASK) ==
3922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             VC1_SP_MP_START_CODE)
3923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
3925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = config->nDataSize;
3927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData =
3928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (OMX_U8 *) malloc(config->nDataSize);
3929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData, config->pData,
3930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   config->nDataSize);
3931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_SP_MP_RCV;
3932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
3934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
3936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = config->nDataSize;
3938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData =
3939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (OMX_U8 *) malloc((config->nDataSize));
3940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData, config->pData,
3941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   config->nDataSize);
3942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_AP;
3943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
3945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
3947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize  = config->nDataSize;
3949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
3950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
3951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_SP_MP_RCV;
3952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
3954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
3956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return ret;
3959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if (configIndex == OMX_IndexConfigVideoNalSize)
3961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
3964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nal_length = pNal->nNaluBytes;
3965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_frame_parser.init_nal_length(nal_length);
3966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
3967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return ret;
3968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
3971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3974e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetExtensionIndex
3976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3977e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX GetExtensionIndex method implementaion.  <TBD>
3979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3980e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3983e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
3985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3987e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
3988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_IN OMX_STRING      paramName,
3989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_OUT OMX_INDEXTYPE* indexType)
3990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
3992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
3994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
3995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
3998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
4006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
4008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
4010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
4011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
4013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
4014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
4018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4019ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan    else if (!strncmp(paramName,"OMX.google.android.index.prepareForAdaptivePlayback",
4020ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            sizeof("OMX.google.android.index.prepareForAdaptivePlayback") - 1)) {
40218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode;
4022ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan    }
4023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
4025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
4027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
4029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4032e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetState
4034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4035e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns the state information back to the caller.<TBD>
4037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4038e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
4040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4041e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Error None if everything is successful.
4043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4044e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
4045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_OUT OMX_STATETYPE* state)
4046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  *state = m_state;
4048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
4049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
4050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4053e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentTunnelRequest
4055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4056e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Component Tunnel Request method implementation. <TBD>
4058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4059e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
4061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4062e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
4064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4066e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
4067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_U32                        port,
4068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
4069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_U32                    peerPort,
4070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
4071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
4073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
4074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4077e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseOutputBuffer
4079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4080e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper function for Use buffer in the input pin
4082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4083e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
4085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4086e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
4088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
4091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
4096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
4097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
4100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned                         i= 0; // Temporary counter
4101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PTR privateAppData = NULL;
4104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
4105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  private_handle_t *handle = NULL;
4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buff = buffer;
4108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr) {
4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_output_headers();
4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
4114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //allocate H264_mv_buffer
4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = vdec_alloc_h264_mv();
4117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eRet) {
4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
4119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
4127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
4128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_out_bm_count,i))
4129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
4131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i >= drv_ctx.op_buf.actualcount) {
4136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
4140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
4141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
41423d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if (m_use_android_native_buffers) {
41433d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
41443d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            sp<android_native_buffer_t> nBuf = params->nativeBuffer;
41453d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            handle = (private_handle_t *)nBuf->handle;
41463d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            privateAppData = params->pAppPrivate;
41473d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        } else {
41483d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            handle = (private_handle_t *)buff;
41493d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            privateAppData = appData;
4150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
41513d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
41523d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
41533d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
41543d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                              " expected %u, got %lu",
41553d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                              drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
41563d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            return OMX_ErrorBadParameter;
4157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
41583d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
41593d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if (!m_use_android_native_buffers) {
41603d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            if (!secure_mode) {
41613d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                buff =  (OMX_U8*)mmap(0, handle->size,
41623d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                                      PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
41633d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                if (buff == MAP_FAILED) {
41643d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                  DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
41653d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                  return OMX_ErrorInsufficientResources;
41663d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                }
41673d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            }
41683d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        }
41693d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
4170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!handle) {
4171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
4173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
4176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4179b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan        native_buffer[i] = handle;
4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else
4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!ouput_egl_buffers && !m_use_output_pmem) {
4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
4187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
418863a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].fd_ion_data,ION_FLAG_CACHED);
4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
4194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          open (MEM_DEVICE,O_RDWR);
4197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
4199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
4203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            open (MEM_DEVICE,O_RDWR);
4206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
4207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size,
4213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.alignment))
4214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
4221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].bufferaddr =
4222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              PROT_READ|PROT_WRITE, MAP_SHARED,
4224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return OMX_ErrorInsufficientResources;
4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
4234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
4237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
4239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (!appData || !bytes )
4241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n Invalid appData or bytes");
4243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if(!secure_mode && !buffer)
4247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
4249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
4254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
4256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
4257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            !pmem_list->nEntries ||
4258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
4259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
4260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pmem_list->entryList->entry;
4264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
4265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          pmem_info->pmem_fd);
4266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
4267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
4270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
4272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
4274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
4275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     *bufferHdr = (m_out_mem_ptr + i );
4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(secure_mode)
4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
4279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
4281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             sizeof (vdec_bufferpayload));
4282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ioctl_msg.in  = &setbuffers;
4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ioctl_msg.out = NULL;
4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
4287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          &ioctl_msg) < 0)
4290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
4291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n Set output buffer failed");
4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorInsufficientResources;
4293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     // found an empty buffer at i
4295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
4296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (m_enable_android_native_buffers) {
4297edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
4298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     } else {
4300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (*bufferHdr)->pBuffer = buff;
4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->pAppPrivate = privateAppData;
4303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     BITMASK_SET(&m_out_bm_count,i);
4304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4309e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::use_input_heap_buffers
4311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4312e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use Buffer Heap allocation method implementation.
4314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4315e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
4317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4318e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None , if everything successful.
4320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
4323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
4328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
4329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
4331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr)
4333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
4334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
4336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_phdr_pmem_ptr)
4337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
4338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
4340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
4341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficent memory");
4343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
4346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = true;
4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
4349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
4350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
4351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
4352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
4353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
4355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL))
4358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_in_alloc_cnt++;
4363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
4367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4373e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::UseBuffer
4375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4376e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Use Buffer method implementation.
4378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4379e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
4381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4382e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None , if everything successful.
4384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4386e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::use_buffer(
4387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
4392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
4393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE error = OMX_ErrorNone;
4395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || bytes == 0)
4399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("bad param 0x%p %ld",bufferHdr, bytes);
4401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
4402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode && buffer == NULL) {
4405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("bad param 0x%p",buffer);
4406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
4407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
4410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
4412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInvalidState;
4413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == OMX_CORE_INPUT_PORT_INDEX)
4415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
4416d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  else if(port == OMX_CORE_OUTPUT_PORT_INDEX) {
4417d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    error = client_buffers.use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
4418d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  }
4419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
4422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = OMX_ErrorBadPortIndex;
4423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
4425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(error == OMX_ErrorNone)
4426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
4428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Send the callback now
4430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandStateSet,OMX_StateIdle,
4432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_EVENT);
4433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
4435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
4436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_CORE_INPUT_PORT_INDEX,
4440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_COMPONENT_GENERATE_EVENT);
4441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
4444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_CORE_OUTPUT_PORT_INDEX,
4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_COMPONENT_GENERATE_EVENT);
4449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return error;
4452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
4455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
4458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_heap_ptr[bufferindex].pBuffer)
4460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free(m_inp_heap_ptr[bufferindex].pBuffer);
4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
4462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (pmem_bufferHdr)
4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer(pmem_bufferHdr);
4465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4468e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int index = 0;
4471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
4472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  index = bufferHdr - m_inp_mem_ptr;
4477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
4480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
4483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       struct vdec_setbuffer_cmd setbuffers;
4486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
4488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          sizeof (vdec_bufferpayload));
4489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.in  = &setbuffers;
4490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.out = NULL;
4491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       int ioctl_r = ioctl (drv_ctx.video_driver_fd,
4492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
4493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       if (ioctl_r < 0)
4494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
4495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
4496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
4497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (!secure_mode) {
4498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
4499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
4500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
4501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].mmaped_size,
4502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.ptr_inputbuffer[index].mmaped_size);
4505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
4507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
4508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
4509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_desc_buffer_ptr[index].buf_addr);
4511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].buf_addr = NULL;
4512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].desc_data_size = 0;
4513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
4521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4523e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int index = 0;
4526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
4528e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nfree_output_buffer ERROR");
4530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  index = bufferHdr - m_out_mem_ptr;
4534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
4535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.op_buf.actualcount
4537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && drv_ctx.ptr_outputbuffer)
4538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
4540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
4541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_setbuffer_cmd setbuffers;
4544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
4546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        sizeof (vdec_bufferpayload));
4547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
4548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
4549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\nRelease the Output Buffer");
4550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
4551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          &ioctl_msg) < 0)
4552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
4553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
4556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
4557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!secure_mode) {
4558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
4559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
4560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
4564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
4566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if(!secure_mode) {
4568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
4569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].pmem_fd);
4570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
4571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].mmaped_size,
4572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].bufferaddr);
4573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr,
4574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].mmaped_size);
4575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
4576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[index]);
4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close (drv_ctx.ptr_outputbuffer[index].pmem_fd);
4580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_heap_ptr[index].video_heap_ptr = NULL;
4583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_heap_count = m_heap_count - 1;
4584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (m_heap_count == 0)
4585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
4586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    free(m_heap_ptr);
4587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    m_heap_ptr = NULL;
4588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
4589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
4590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    vdec_dealloc_h264_mv();
4599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
4603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4606e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
4607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_BUFFERHEADERTYPE **bufferHdr,
4608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32              port,
4609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_PTR              appData,
4610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32              bytes)
4611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *input = NULL;
4613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char *buf_addr = NULL;
4614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned   i = 0;
4616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* Sanity Check*/
4618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL)
4619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_inp_heap_ptr == NULL)
4624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
4626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
4629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_inp_heap_ptr == NULL)
4633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
4635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Find a Free index*/
4640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
4643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.ip_buf.actualcount)
4650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
4652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (buf_addr == NULL)
4654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *bufferHdr = (m_inp_heap_ptr + i);
4659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input = *bufferHdr;
4660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    BITMASK_SET(&m_heap_inp_bm_count,i);
4661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pBuffer           = (OMX_U8 *)buf_addr;
4663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nVersion.nVersion = OMX_SPEC_VERSION;
4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pAppPrivate       = appData;
4667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
4669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
4670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] );
4671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Add the Buffers to freeq*/
4672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL))
4673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
4679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4689e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateInputBuffer
4691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4692e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper function for allocate buffer in the input pin
4694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4695e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
4697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4698e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
4700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4702e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
4703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes)
4708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_setbuffer_cmd setbuffers;
4712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *input = NULL;
4713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned   i = 0;
4715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char *buf_addr = NULL;
4716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int pmem_fd = -1;
4717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bytes != drv_ctx.ip_buf.buffer_size)
4719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes, drv_ctx.ip_buf.buffer_size);
4722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //return OMX_ErrorBadParameter;
4723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(!m_inp_mem_ptr)
4726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
4728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.actualcount,
4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.buffer_size);
4730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_inp_mem_ptr == NULL)
4735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer == NULL)
4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
4748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info == NULL)
4751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
4757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_inp_bm_count,i))
4768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i < drv_ctx.ip_buf.actualcount)
4775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Allocate input Buffer");
4777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
478263a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev		    &drv_ctx.ip_buf_ion_info[i].fd_ion_data,ION_FLAG_CACHED);
4783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pmem_fd < 0)
4791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pmem_fd == 0)
4797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
4799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pmem_fd < 0)
4801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInsufficientResources;
4804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.alignment))
4809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      close(pmem_fd);
4812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
4816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buf_addr = (unsigned char *)mmap(NULL,
4817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ip_buf.buffer_size,
4818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buf_addr == MAP_FAILED)
4821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            close(pmem_fd);
4823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_inp_mem_ptr + i);
4831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
4836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].offset = 0;
4839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer [i],
4842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            sizeof (vdec_bufferpayload));
4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
4845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
4847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         &ioctl_msg) < 0)
4848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set Buffers Failed");
4850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input = *bufferHdr;
4854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    BITMASK_SET(&m_inp_bm_count,i);
4855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer           = (OMX_U8 *)buf_addr;
4860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nVersion.nVersion = OMX_SPEC_VERSION;
4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pAppPrivate       = appData;
4864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
4866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.disable_dmx)
4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = allocate_desc_buffer(i);
4870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
4873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
4875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorInsufficientResources;
4876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4882e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateOutputBuffer
4884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4885e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper fn for AllocateBuffer in the output pin
4887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4888e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
4890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4891e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went well.
4893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4895e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
4896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes)
4901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
4904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned                         i= 0; // Temporary counter
4905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_setbuffer_cmd setbuffers;
4907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_device_fd =-1;
4909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_allocation_data ion_alloc_data;
4910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_fd_data fd_ion_data;
4911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nBufHdrSize        = 0;
4914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPlatformEntrySize = 0;
4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPlatformListSize  = 0;
4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPMEMInfoSize = 0;
4917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int pmem_fd = -1;
4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char *pmem_baseaddress = NULL;
4919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr)
4925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
4927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount,
4928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size);
4929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
4931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
4934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
4935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
4937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
4938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
4939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
4940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
4941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
4942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
4944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_BUFFERHEADERTYPE),
4945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         nPMEMInfoSize,
4946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         nPlatformListSize);
4947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
4948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         drv_ctx.op_buf.actualcount);
4949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
4951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Alloc mem for platform specific info
4952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char *pPtr=NULL;
4953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
4954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     nPMEMInfoSize,1);
4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
4956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
4957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
4959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
4960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
4963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),
4964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr = (struct vidc_heap *)\
4968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       calloc (sizeof(struct vidc_heap),
4969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
4973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer
4974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   && m_heap_ptr
4976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   )
4978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_outputbuffer[0].mmaped_size =
4980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (drv_ctx.op_buf.buffer_size *
4981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         drv_ctx.op_buf.actualcount);
4982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bufHdr          =  m_out_mem_ptr;
4983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
4984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
4985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        (((char *) m_platform_list)  + nPlatformListSize);
4986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        (((char *) m_platform_entry) + nPlatformEntrySize);
4988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPlatformList   = m_platform_list;
4989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPlatformEntry  = m_platform_entry;
4990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPMEMInfo       = m_pmem_info;
4991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
4993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Settting the entire storage nicely
4995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
4996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
4997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
4998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
5000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
5001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Set the values when we determine the right HxW param
5002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
5003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nFilledLen         = 0;
5004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
5005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
5006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Platform specific PMEM Information
5007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Initialize the Platform Entry
5008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
5009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
5010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry->entry      = pPMEMInfo;
5011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Initialize the Platform List
5012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList->nEntries    = 1;
5013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList->entryList   = pPlatformEntry;
5014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Keep pBuffer NULL till vdec is opened
5015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->pBuffer            = NULL;
5016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
5018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPMEMInfo->pmem_fd = 0;
5019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->pPlatformPrivate = pPlatformList;
5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
5022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
5023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Create a mapping between buffers*/
5025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
5026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
5027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
5028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_heap_ptr[i].video_heap_ptr = NULL;
5030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Move the buffer and buffer header pointers
5032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr++;
5033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPMEMInfo++;
5034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry++;
5035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList++;
5036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eRet == OMX_ErrorNone && drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //Allocate the h264_mv_buffer
5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = vdec_alloc_h264_mv();
5042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(eRet) {
5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
5044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
5045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
5052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        m_out_mem_ptr, pPtr);
5053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(m_out_mem_ptr)
5054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_out_mem_ptr);
5056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_out_mem_ptr = NULL;
5057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(pPtr)
5059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(pPtr);
5061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPtr = NULL;
5062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
5064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
5066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
5067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
5069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
5072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
5074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
5075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
5076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
5077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
5078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet =  OMX_ErrorInsufficientResources;
5081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for (i=0; i< drv_ctx.op_buf.actualcount; i++)
5085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_out_bm_count,i))
5087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Found a Free Output Buffer Index %d",i);
5089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
5090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.op_buf.actualcount)
5094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate Output Buffer");
5096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
5098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
5099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
5100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
51018dac2f1932988a8a2ac17b2dce59110d589a5e62Praveen Chavan                    &drv_ctx.op_buf_ion_info[i].fd_ion_data, 0);
5102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
5103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
5104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     }
5105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
5106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
5107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
5108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd < 0)
5110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf.buffer_size);
5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd == 0)
5117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pmem_fd < 0)
5121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
5123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           drv_ctx.op_buf.buffer_size);
5124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorInsufficientResources;
5125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size,
5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.alignment))
5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(pmem_fd);
5133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
5137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_baseaddress = (unsigned char *)mmap(NULL,
5138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           drv_ctx.op_buf.buffer_size,
5139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
5140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pmem_baseaddress == MAP_FAILED)
5142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
5144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size);
5145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(pmem_fd);
5146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
5147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
5148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
5150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_out_mem_ptr + i);
5154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
5155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer [i].bufferaddr = *bufferHdr;
5156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer [i].bufferaddr = pmem_baseaddress;
5158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].pmem_fd = pmem_fd;
5160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].buffer_len = drv_ctx.op_buf.buffer_size;
5161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].mmaped_size = drv_ctx.op_buf.buffer_size;
5162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].offset = 0;
5163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev #ifdef USE_ION
5166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr[i].video_heap_ptr = new VideoHeap (drv_ctx.op_buf_ion_info[i].ion_device_fd,
5167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                drv_ctx.op_buf.buffer_size,
5168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_baseaddress,
5169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ion_alloc_data.handle,
5170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_fd);
5171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_count = m_heap_count + 1;
517240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#else
5173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr[i].video_heap_ptr = new VideoHeap (pmem_fd,
5174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                drv_ctx.op_buf.buffer_size,
5175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_baseaddress);
5176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
5180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr[i].video_heap_ptr.get ();
5182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
5183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd ;
5184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
5186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer [i],
5187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            sizeof (vdec_bufferpayload));
5188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
5189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
5190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
519163a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev    DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
5192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
5193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         &ioctl_msg) < 0)
5194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Set output buffer failed");
5196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // found an empty buffer at i
5200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
5201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
5202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->pAppPrivate = appData;
5203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    BITMASK_SET(&m_out_bm_count,i);
5204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Output Buffer Index not found");
5209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
5210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
5212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// AllocateBuffer  -- API Call
5216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5217e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateBuffer
5219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5220e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns zero if all the buffers released..
5222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5223e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5226e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5230e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
5231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
5232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_U32                        port,
5233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_PTR                     appData,
5234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_U32                       bytes)
5235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned i = 0;
5237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
5238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
5240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
5241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
5243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
5244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(port == OMX_CORE_INPUT_PORT_INDEX)
5247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (arbitrary_bytes)
5249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
5251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
5253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
5255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
525940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
526040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                                                           appData,bytes);
5261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
5265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadPortIndex;
5266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
5268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(eRet == OMX_ErrorNone)
5269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(allocate_done()){
5271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
5272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
5274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
5275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandStateSet,OMX_StateIdle,
5276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_COMPONENT_GENERATE_EVENT);
5277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
5280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
5282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
5284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortEnable,
5285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_CORE_INPUT_PORT_INDEX,
5286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
5287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
5288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
5290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
5292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
5294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandPortEnable,
5295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_CORE_OUTPUT_PORT_INDEX,
5296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_COMPONENT_GENERATE_EVENT);
5297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
5301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return eRet;
5302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Free Buffer - API call
5305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5306e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::FreeBuffer
5308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5309e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5311e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5314e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5318e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_U32                 port,
5320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
5323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int nPortIndex;
5324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("In for decoder free_buffer \n");
5326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateIdle &&
5328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
5331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
5333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
5334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
5336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
5338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
5340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,
5341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_ErrorPortUnpopulated,
5342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
5343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
5345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (m_state != OMX_StateInvalid)
5347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
5349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,
5350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_ErrorPortUnpopulated,
5351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
5352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(port == OMX_CORE_INPUT_PORT_INDEX)
5355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /*Check if arbitrary bytes*/
5357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!arbitrary_bytes && !input_use_buffer)
5358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        nPortIndex = buffer - m_inp_mem_ptr;
5359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - m_inp_heap_ptr;
5361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.ip_buf.actualcount)
5364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // Clear the bit associated with it.
5366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (input_use_buffer == true)
5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
5370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
5372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_phdr_pmem_ptr)
5373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
5374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (arbitrary_bytes)
5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(m_phdr_pmem_ptr)
5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
5381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,NULL);
5383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_input_buffer(buffer);
5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_inp_bPopulated = OMX_FALSE;
5388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /*Free the Buffer Header*/
5389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (release_input_done())
5390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer_header();
5393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
5394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
5396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
5398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            eRet = OMX_ErrorBadPortIndex;
5399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
5402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           && release_input_done())
5403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
5406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            post_event(OMX_CommandPortDisable,
5407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       OMX_CORE_INPUT_PORT_INDEX,
5408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       OMX_COMPONENT_GENERATE_EVENT);
5409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // check if the buffer is valid
541440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.op_buf.actualcount)
5416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
5418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Clear the bit associated with it.
5419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
5420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_out_bPopulated = OMX_FALSE;
542140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            client_buffers.free_output_buffer (buffer);
5422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (release_output_done())
5424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_output_buffer_header();
5426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
5429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
5431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            eRet = OMX_ErrorBadPortIndex;
5432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           && release_output_done())
5435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
5437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandPortDisable,
5442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_CORE_OUTPUT_PORT_INDEX,
5443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_COMPONENT_GENERATE_EVENT);
5444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
5449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((eRet == OMX_ErrorNone) &&
5451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(release_done())
5454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Send the callback now
5456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
5457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            post_event(OMX_CommandStateSet, OMX_StateLoaded,
5458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_COMPONENT_GENERATE_EVENT);
5459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return eRet;
5462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5466e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::EmptyThisBuffer
5468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5469e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This routine is used to push the encoded video frames to
5471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  the video decoder.
5472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5473e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5476e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went successful.
5478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5480e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_config_flag = true;
5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
5490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_config_flag = false;
5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
5497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
5499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
5500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL)
5503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
5505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_inp_bEnabled)
5509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex);
5517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(iDivXDrmDecrypt)
5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
5524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drmErr != OMX_ErrorNone) {
5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // this error can be ignored
5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!latency)
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.stop();
5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      latency = dec_time.processing_time_us();
5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.start();
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (arbitrary_bytes)
5541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nBufferIndex = buffer - m_inp_heap_ptr;
5543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
5545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (input_use_buffer == true)
5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
5548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_heap_ptr;
5549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
5551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       buffer = &m_inp_mem_ptr[nBufferIndex];
5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else{
5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_mem_ptr;
5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
5562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
5564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
5569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (arbitrary_bytes)
5570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned)hComp,(unsigned)buffer,
5572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
5573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
5575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
5577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(buffer->nTimeStamp);
5578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
5579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5584e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::empty_this_buffer_proxy
5586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5587e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This routine is used to push the encoded video frames to
5589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  the video decoder.
5590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5591e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5594e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went successful.
5596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5598e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
5599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int push_cnt = 0,i=0;
5602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned nPortIndex = 0;
5603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
5604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_input_frameinfo frameinfo;
5605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_bufferpayload *temp_buffer;
5606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg;
5607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_seqheader seq_header;
5608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool port_setting_changed = true;
5609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool not_coded_vop = false;
5611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Should we generate a Aync error event*/
5614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
5615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
5617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
5621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nPortIndex > drv_ctx.ip_buf.actualcount)
5623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
5625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        nPortIndex);
5626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pending_input_buffers++;
5630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
5632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
5633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
5634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer");
5636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EBD);
5638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
5643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4StreamType psBits;
5644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
5645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.numBytes = buffer->nFilledLen;
5646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4_headerparser.parseHeader(&psBits);
5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    not_coded_vop = mp4_headerparser.is_notcodec_vop(
5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(not_coded_vop) {
5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\n Found Not coded vop len %d frame number %d",
5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             buffer->nFilledLen,frame_count);
5652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
5653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          not_coded_vop = false;
5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          buffer->nFilledLen = 0;
5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(input_flush_progress == true
5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     || not_coded_vop
5663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     )
5665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
5669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
5673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
5675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
5680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*for use buffer we need to memcpy the data*/
5681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  temp_buffer->buffer_len = buffer->nFilledLen;
5682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (input_use_buffer)
5684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (buffer->nFilledLen <= temp_buffer->buffer_len)
5686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(arbitrary_bytes)
5688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
5692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
5694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->nFilledLen);
5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
5700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.bufferaddr = temp_buffer->bufferaddr;
5705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.client_data = (void *) buffer;
5706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.datalen = temp_buffer->buffer_len;
5707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.flags = 0;
5708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.offset = buffer->nOffset;
5709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.pmem_fd = temp_buffer->pmem_fd;
5710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.pmem_offset = temp_buffer->offset;
5711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.timestamp = buffer->nTimeStamp;
5712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: dmx enabled");
5715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_demux_entries == 0)
5716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extract_demux_addr_offsets(buffer);
5718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
5721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    handle_demux_data(buffer);
5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
5724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = NULL;
5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = 0;
5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!arbitrary_bytes)
5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frameinfo.flags |= buffer->nFlags;
5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
5738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(arbitrary_bytes)
5740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
5745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (inputBufferFile1)
5754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite((const char *)temp_buffer->bufferaddr,
5756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      temp_buffer->buffer_len,1,inputBufferFile1);
5757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
5761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
5770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_scratch.nFilledLen = 0;
5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_count = 0;
5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
5773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_count = 0;
5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.mutils)
5775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_frame_parser.mutils->initialize_frame_checking_environment();
5776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.flush();
5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
5778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
5779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
5780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
5781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
5783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
5784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &frameinfo;
5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
5787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            &ioctl_msg) < 0)
5788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Generate an async error and move to invalid state*/
5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy VDEC_IOCTL_DECODE_FRAME failed");
5791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!arbitrary_bytes)
5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Return failed buffer");
5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EBD);
5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else
5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      time_stamp_dts.insert_timestamp(buffer);
5800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
5802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5805e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::FillThisBuffer
5807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5808e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL client uses this method to release the frame buffer
5810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  after displaying them.
5811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5812e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5815e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5819e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
5820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
5824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
5826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
5827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_bEnabled)
5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer == NULL ||
583640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George     ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount))
5837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
5842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
5844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
584840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  post_event((unsigned) hComp, (unsigned)buffer,m_fill_output_msg);
5849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5852e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::fill_this_buffer_proxy
5854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5855e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL client uses this method to release the frame buffer
5857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  after displaying them.
5858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5859e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5862e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5866e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
5867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE        hComp,
5868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE nRet = OMX_ErrorNone;
5871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
5872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
5873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_fillbuffer_cmd fillbuffer;
5874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
5875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
5876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
587840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (bufferAdd == NULL || ((buffer - client_buffers.get_il_buf_hdr()) >
5879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount) )
5880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
5883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bufferAdd, bufferAdd->pBuffer);
5884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Return back the output buffer to client*/
5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
5886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
5889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pending_output_buffers++;
589340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
5894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
5895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ptr_respbuffer)
5896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
5898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
5901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
5903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer->nFilledLen = 0;
5904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.FillBufferDone (hComp,m_app_data,buffer);
5905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_output_buffers--;
5906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
5907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
5910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          sizeof(struct vdec_bufferpayload));
591140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  fillbuffer.client_data = buffer;
5912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &fillbuffer;
5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,
5916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
5917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Decoder frame failed");
5919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_output_buffers--;
5921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5928e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SetCallbacks
5930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5931e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Set the callbacks.
5933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5934e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5937e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
5939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5941e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
5942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
5943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_PTR             appData)
5944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_cb       = *callbacks;
5947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
5948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               m_cb.EventHandler,m_cb.FillBufferDone);
5949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_app_data =    appData;
5950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
5951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5954e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentDeInit
5956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5957e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Destroys the component and release memory allocated to the heap.
5959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5960e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
5962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5963e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
5965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5967e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(iDivXDrmDecrypt)
5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int i = 0;
5977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (OMX_StateLoaded != m_state)
5978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
5980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          m_state);
5981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
5982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
5986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5988fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secure_mode) {
5989fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      if (unsecureDisplay(qService::IQService::START) < 0) {
5990fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_HIGH("Failed to send message to unsecure display START");
5991fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      }
5992fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
5993fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
5994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if the output buffers have to be cleaned up*/
5995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_out_mem_ptr)
5996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Freeing the Output Memory\n");
5998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i < drv_ctx.op_buf.actualcount; i++ )
5999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          free_output_buffer (&m_out_mem_ptr[i]);
6001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if the input buffers have to be cleaned up*/
6005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_mem_ptr || m_inp_heap_ptr)
6006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Freeing the Input Memory\n");
6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i<drv_ctx.ip_buf.actualcount; i++ )
6009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_inp_mem_ptr)
6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,&m_inp_mem_ptr[i]);
6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
6013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,NULL);
6014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
6017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
6018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(h264_scratch.pBuffer)
6019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
6021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
6022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
6025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
6027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	h264_parser = NULL;
6028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6030ea042d401be95d9490b5d839f32d19a42507c3f3Deva Ramasubramanian    if (m_frame_parser.mutils)
6031ea042d401be95d9490b5d839f32d19a42507c3f3Deva Ramasubramanian    {
6032ea042d401be95d9490b5d839f32d19a42507c3f3Deva Ramasubramanian        DEBUG_PRINT_LOW("\n Free utils parser");
6033ea042d401be95d9490b5d839f32d19a42507c3f3Deva Ramasubramanian        delete (m_frame_parser.mutils);
6034ea042d401be95d9490b5d839f32d19a42507c3f3Deva Ramasubramanian        m_frame_parser.mutils = NULL;
6035ea042d401be95d9490b5d839f32d19a42507c3f3Deva Ramasubramanian    }
6036ea042d401be95d9490b5d839f32d19a42507c3f3Deva Ramasubramanian
6037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_platform_list)
6038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_platform_list);
6040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_platform_list = NULL;
6041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_vendor_config.pData)
6043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_vendor_config.pData);
6045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_vendor_config.pData = NULL;
6046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Reset counters in mesg queues
6049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.m_size=0;
6050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.m_size=0;
6051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.m_size=0;
6052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.m_read = m_ftb_q.m_write =0;
6053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.m_read = m_cmd_q.m_write =0;
6054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.m_read = m_etb_q.m_write =0;
6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_debug_timestamp)
6057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.reset_ts_list();
6059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
6063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
6064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        NULL);
6065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Close the driver instance");
6066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* get strong count gets the refernce count of the pmem, the count will
6068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * be incremented by our kernal driver and surface flinger, by the time
6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * we close the pmem, this cound needs to be zero, but there is no way
6070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * for us to know when surface flinger reduces its cound, so we wait
6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * here in a infinite loop till the count is zero
6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    */
6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (m_heap_ptr)
6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         for (int indx = 0; indx < drv_ctx.op_buf.actualcount; indx++)
6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_heap_ptr[indx].video_heap_ptr = NULL;
6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_heap_ptr);
6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_heap_ptr = NULL;
6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_heap_count = 0;
6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
6081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_
6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(drv_ctx.video_driver_fd);
6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
6084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
6085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputBufferFile1);
6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
6091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6092fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
6093fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secure_mode) {
6094fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      if (unsecureDisplay(qService::IQService::END) < 0) {
6095fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_HIGH("Failed to send message to unsecure display STOP");
6096fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      }
6097fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
6098fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
6099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
6100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6104e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::UseEGLImage
6106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6107e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Use EGL Image method implementation <TBD>.
6109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6110e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
6112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6113e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Not Implemented error.
6115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6117e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
6118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
6119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_U32                        port,
6120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_PTR                     appData,
6121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN void*                      eglImage)
6122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
6124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
6125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
6126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
6128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
6129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   EGLint fd = -1, offset = 0,pmemPtr = 0;
6130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
6131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int fd = -1, offset = 0;
6132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
6134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
6135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("\n ");
6136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
6138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_display_id == NULL) {
6139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
6140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
6143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    eglGetProcAddress("eglQueryImageKHR");
6144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
6146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
6147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
6148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
6149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
6150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
6151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
6152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
6153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
6154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
6155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (temp_egl_id != NULL)
6156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
6158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
6159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
6162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
6163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.pmem_fd = (OMX_U32) fd;
6166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.offset = (OMX_U32) offset;
6167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.entry = (void *) &pmem_info;
6168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
6169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.entryList = &pmem_entry;
6170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.nEntries = 1;
6171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ouput_egl_buffers = true;
6172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
6173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
6174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_U8 *)pmemPtr)) {
6175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
6176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorInsufficientResources;
6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return OMX_ErrorNone;
6179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6182e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentRoleEnum
6184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6185e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Component Role Enum method implementation.
6187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6188e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
6190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6191e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything is successful.
6193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6194e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
6195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_OUT OMX_U8*        role,
6196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_IN OMX_U32        index)
6197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
6199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
6201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
6203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
6205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
6210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
6213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
6215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
6217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
6222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
6225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
6229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
6234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
6238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
6239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
6240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          )
6241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
6242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
6243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
6248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
6257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
6261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
6270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           )
6272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
6276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
6287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorInvalidComponentName;
6288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
6290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6296e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateDone
6298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6299e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if entire buffer pool is allocated by IL Client or not.
6301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Need this to move to IDLE state.
6302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6303e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6306e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_done(void)
6311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet_In = false;
6314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet_Out = false;
6315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet_In = allocate_input_done();
6317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet_Out = allocate_output_done();
6318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(bRet_In && bRet_Out)
6320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6327e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateInputDone
6329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6330e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if I/P buffer pool is allocated by IL Client or not.
6332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6333e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6336e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_input_done(void)
6341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0;
6344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_inp_mem_ptr == NULL)
6346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return bRet;
6348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_inp_mem_ptr )
6350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;i<drv_ctx.ip_buf.actualcount;i++)
6352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(BITMASK_ABSENT(&m_inp_bm_count,i))
6354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
6356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i == drv_ctx.ip_buf.actualcount)
6360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
6363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
6365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     m_inp_bPopulated = OMX_TRUE;
6367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6371e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateOutputDone
6373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6374e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if entire O/P buffer pool is allocated by IL Client or not.
6376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6377e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6380e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_output_done(void)
6385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned j=0;
6388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_out_mem_ptr == NULL)
6390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return bRet;
6392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
6395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;j < drv_ctx.op_buf.actualcount;j++)
6397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(BITMASK_ABSENT(&m_out_bm_count,j))
6399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
6401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(j == drv_ctx.op_buf.actualcount)
6406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
6409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_bEnabled)
6410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_out_bPopulated = OMX_TRUE;
6411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6417e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseDone
6419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6420e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6423e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6426e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_done(void)
6431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(release_input_done())
6435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(release_output_done())
6437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bRet = true;
6439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6446e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseOutputDone
6448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6449e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6452e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6455e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_output_done(void)
6460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0,j=0;
6463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
6465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_out_mem_ptr)
6466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j < drv_ctx.op_buf.actualcount ; j++)
6468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT(&m_out_bm_count,j))
6470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
6472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j == drv_ctx.op_buf.actualcount)
6475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_out_bm_count = 0;
6477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_out_bm_count = 0;
6483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6488e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseInputDone
6490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6491e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6494e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6497e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_input_done(void)
6502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0,j=0;
6505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
6507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_inp_mem_ptr)
6508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j<drv_ctx.ip_buf.actualcount;j++)
6510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if( BITMASK_PRESENT(&m_inp_bm_count,j))
6512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
6514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j==drv_ctx.ip_buf.actualcount)
6517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_BUFFERHEADERTYPE * buffer)
6530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
6532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
6533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
6535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (output_flush_progress)
6538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
6540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
6541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nTimeStamp = 0;
6542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
6543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
6545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char value[PROPERTY_VALUE_MAX];
6549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.panframedata", value, NULL);
6550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (atoi(value))
6552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
6554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n");
6556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
6558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
6562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n");
6564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
6566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer, buffer->pBuffer);
6573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_output_buffers --;
6574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Output EOS has been reached");
6578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!output_flush_progress)
6579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
6580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame)
6582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
6584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
6585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame)
6587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen = 0;
6589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
6590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame = NULL;
6591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
6595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputBufferFile1)
6597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6598edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U32 index = buffer - m_out_mem_ptr;
6599edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
6600edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
6601edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    fwrite (pBuffer,1,buffer->nFilledLen,
6602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  outputBufferFile1);
6603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* For use buffer we need to copy the data */
6607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!output_flush_progress)
6608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.get_next_timestamp(buffer,
6610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
6611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ?true:false);
6612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_cb.FillBufferDone)
6614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFilledLen > 0)
6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata)
6618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        handle_extradata(buffer);
6619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep min timestamp interval to handle corrupted bit stream scenario
6621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        set_frame_rate(buffer->nTimeStamp);
6622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (arbitrary_bytes)
6623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        adjust_timestamp(buffer->nTimeStamp);
6624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (perf_flag)
6626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!proc_frms)
6628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.stop();
6630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          latency = dec_time.processing_time_us() - latency;
6631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
6632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.start();
6633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.start();
6634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        proc_frms++;
6636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_U64 proc_time = 0;
6639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.stop();
6640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_time = fps_metrics.processing_time_us();
6641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            proc_frms, (float)proc_time / 1e6,
6643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (float)(1e6 * proc_frms) / proc_time);
6644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_frms = 0;
6645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
6648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputExtradataFile)
6651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6653edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U32 index = buffer - m_out_mem_ptr;
6654edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
6655edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
6656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
6657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *)
6658edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George           ((unsigned)(pBuffer + buffer->nOffset +
6659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen + 3)&(~3));
6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra &&
6661edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George          (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) )
6662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
6664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
6665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == OMX_ExtraDataNone)
6666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
6670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = LLONG_MAX;
6676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rst_prev_ts = true;
6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
6680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
6681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->pPlatformPrivate)->entryList->entry;
6682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
668340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    OMX_BUFFERHEADERTYPE *il_buffer;
668440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    il_buffer = client_buffers.get_il_buf_hdr(buffer);
668540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (il_buffer)
668640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
668740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else {
668840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
668940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorBadParameter;
669040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
669140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
6692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
6693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
6697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6699b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan // ss change
6700b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan if (m_use_smoothstreaming) {
6701b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan    OMX_U32 buf_index = buffer - m_out_mem_ptr;
6702b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan    private_handle_t * handle = NULL;
6703b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan    BufferDim_t dim;
6704b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan    dim.sliceWidth = m_port_def.format.video.nStride;
6705b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan    dim.sliceHeight = m_port_def.format.video.nSliceHeight;
6706b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan    handle = (private_handle_t *)native_buffer[buf_index];
6707ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan    DEBUG_PRINT_LOW("NOTE: set metadata: update buffer geo with "
6708ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            "stride %d slice %d", dim.sliceWidth, dim.sliceHeight);
6709b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan    setMetaData(handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim);
6710b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan  }
6711b597ba5fbaa5e26b54c1e0b5382d3448aad82cbcPraveen Chavan
6712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6715e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
6716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_BUFFERHEADERTYPE* buffer)
6717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
6720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
6722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       return OMX_ErrorBadParameter;
6723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer, buffer->pBuffer);
6727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pending_input_buffers--;
6728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (arbitrary_bytes)
6730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame == NULL && input_flush_progress == false)
6732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
6734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = buffer;
6735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nTimeStamp = LLONG_MAX;
6737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        push_input_buffer (hComp);
6738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
6740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
6742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL))
6744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
6746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_cb.EmptyBufferDone)
6750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (input_use_buffer == true){
6753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
6758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint omx_vdec::async_message_process (void *context, void* message)
6762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec* omx = NULL;
6764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_msginfo *vdec_msg = NULL;
6765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
6766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_output_frameinfo *output_respbuf = NULL;
6767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (context == NULL || message == NULL)
6769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
6771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return -1;
6772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  vdec_msg = (struct vdec_msginfo *)message;
6774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx = reinterpret_cast<omx_vdec*>(context);
6776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (omx->m_debug_timestamp)
6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
6781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         !(omx->output_flush_progress) )
6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_TICKS expected_ts = 0;
6784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->m_timestamp_list.pop_min_ts(expected_ts);
6785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
6786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
6787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch (vdec_msg->msgcode)
6797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_EVT_HW_ERROR:
6800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_START_DONE:
6805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_START_DONE);
6807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_STOP_DONE:
6810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_STOP_DONE);
6812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_RESUME_DONE:
6815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_RESUME_DONE);
6817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_PAUSE_DONE:
6820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
6822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
6825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
6827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
6829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
6831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_INPUT_FLUSHED:
6833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
6834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxhdr = (OMX_BUFFERHEADERTYPE* )\
6836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              vdec_msg->msgdata.input_frame_clientdata;
6837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (omxhdr == NULL ||
6840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
6841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       omxhdr = NULL;
6843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       vdec_msg->status_code = VDEC_S_EFATAL;
6844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EBD);
6848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
6850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int64_t *timestamp;
6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      timestamp = (int64_t *) malloc(sizeof(int64_t));
6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (timestamp) {
6853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
6854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
6855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
6856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
6857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             vdec_msg->msgdata.output_frame.time_stamp);
6858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
6861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
6862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxhdr = (OMX_BUFFERHEADERTYPE*)vdec_msg->msgdata.output_frame.client_data;
6863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
6864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
6865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      vdec_msg->msgdata.output_frame.pic_type);
6866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* update SYNCFRAME flag */
6868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omx->eCompressionFormat == OMX_VIDEO_CodingAVC)
6869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* set SYNCFRAME flag if picture type is IDR for h264 */
6871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_IDR)
6872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
6873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
6875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* set SYNCFRAME flag if picture type is I_TYPE */
6879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_I)
6880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
6881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
6883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omxhdr && omxhdr->pOutputPortPrivate &&
6886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
6887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
6888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
6889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
6891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
6893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
6894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
6895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nFlags = (vdec_msg->msgdata.output_frame.flags);
6896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf = (struct vdec_output_frameinfo *)\
6898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          omxhdr->pOutputPortPrivate;
689982175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan        if (omxhdr->nFilledLen && ((omx->rectangle.nLeft != vdec_msg->msgdata.output_frame.framesize.left)
690082175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            || (omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
690182175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
690282175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom)))
690382175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan        {
6904355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan            DEBUG_PRINT_LOW("Old crop info: left = %u top = %u width = %u height = %u\n",
6905355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan                omx->rectangle.nLeft, omx->rectangle.nTop,
6906355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan                omx->rectangle.nWidth, omx->rectangle.nHeight);
690782175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
690882175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
690982175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
691082175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
691182175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            DEBUG_PRINT_HIGH(" Crop information has changed");
6912355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan            DEBUG_PRINT_LOW("New crop info: left = %u top = %u width = %u height = %u\n",
6913355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan                omx->rectangle.nLeft, omx->rectangle.nTop,
6914355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan                omx->rectangle.nWidth, omx->rectangle.nHeight);
691582175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
691682175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
691782175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan        }
691882175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan
6919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.bottom =
6920090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.bottom;
6921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.left =
6922090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.left;
6923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.right =
6924090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.right;
6925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.top =
6926090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.top;
6927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
6928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
6929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
6930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
6931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
6932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
6933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->aspect_ratio_info =
6934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           vdec_msg->msgdata.output_frame.aspect_ratio_info;
6935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (omx->output_use_buffer)
6938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ( omxhdr->pBuffer,
693998bc0c5ecd78366772afc957988a2a69259e59a0synergydev                   ((char*)vdec_msg->msgdata.output_frame.bufferaddr +
6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.offset),
6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.len );
6942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
6944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nFilledLen = 0;
6945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
6946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_FBD);
6947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
6949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EOS_DONE);
6951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_CONFIG_CHANGED:
6956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed");
695782175aba958b9c157a7ecbda9af907f9d4e20052Praveen Chavan    omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_PORT_RECONFIG);
6959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
6961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed info");
6963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // get_buffer_req and populate port defn structure
6964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->m_port_def.nPortIndex = 1;
6966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = omx->update_portdef(&(omx->m_port_def));
6967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  default:
6970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return 1;
6973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6975e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
6976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   OMX_HANDLETYPE hComp,
6977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   OMX_BUFFERHEADERTYPE *buffer
6978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                           )
6979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
6981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Empty this arbitrary");
6982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL)
6984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
6986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
6988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
6989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
6990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return buffer if input flush in progress */
6993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
6995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
6997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
6998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
6999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (psource_frame == NULL)
7002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
7004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    psource_frame = buffer;
7005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
7006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    push_input_buffer (hComp);
7007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
7009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
7011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL))
7012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
7014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
7019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7021e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
7022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
7024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
7025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (pdest_frame == NULL || psource_frame == NULL)
7027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if we have a destination buffer*/
7029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame == NULL)
7030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
7032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_free_q.m_size)
7033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_free_q.pop_entry(&address,&p2,&id);
7035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
7036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame->nFilledLen = 0;
7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = LLONG_MAX;
7038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
7039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if we have a destination buffer*/
7043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame == NULL)
7044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_pending_q.m_size)
7047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_pending_q.pop_entry(&address,&p2,&id);
7049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
7050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
7051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                psource_frame->nTimeStamp);
7052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
7053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame->nFlags,psource_frame->nFilledLen);
7054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while ((pdest_frame != NULL) && (psource_frame != NULL))
7061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch (codec_type_parse)
7063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_MPEG4:
7065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_H263:
7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_MPEG2:
7067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret =  push_input_sc_codec(hComp);
7068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
7069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_H264:
7070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret = push_input_h264(hComp);
7071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
7072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_VC1:
7073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret = push_input_vc1(hComp);
7074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
7075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ret != OMX_ErrorNone)
7077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
7079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      omx_report_error ();
7080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
7081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
7085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7087e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
7088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_U32 partial_frame = 1;
7090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
7091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
7092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
7094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame,psource_frame->nTimeStamp);
7095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_frame_parser.parse_sc_frame(psource_frame,
7096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       pdest_frame,&partial_frame) == -1)
7097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
7099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
7100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (partial_frame == 0)
7103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
7105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pdest_frame->nFilledLen,psource_frame,frame_count);
7106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
7109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*First Parsed buffer will have only header Hence skip*/
7110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (frame_count == 0)
7111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
7113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
7114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
7115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         codec_type_parse == CODEC_TYPE_DIVX) {
7116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4StreamType psBits;
7117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
7118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.numBytes = pdest_frame->nFilledLen;
7119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4_headerparser.parseHeader(&psBits);
7120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      frame_count++;
7123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pdest_frame->nFilledLen)
7128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
7130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
7135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
7136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_input_free_q.m_size)
7138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_input_free_q.pop_entry(&address,&p2,&id);
7140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
7141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen = 0;
7142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
7145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
7147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
7148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
7149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
7153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
7155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if Destination Buffer is full*/
7156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame->nAllocLen ==
7157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame->nFilledLen + pdest_frame->nOffset)
7158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
7160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorStreamCorrupt;
7161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (psource_frame->nFilledLen == 0)
7165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
7167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame)
7169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags |= psource_frame->nFlags;
7171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
7172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
7173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
7174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame->nFilledLen,frame_count++);
7175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Push the frame to the Decoder*/
7176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        frame_count++;
7181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = NULL;
7182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
7186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
7187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly   }
7189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(generate_ebd)
7190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
7192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
7194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (m_input_pending_q.m_size)
7196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
7198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_pending_q.pop_entry(&address,&p2,&id);
7199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
7200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
7201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                psource_frame->nTimeStamp);
7202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
7203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame->nFlags,psource_frame->nFilledLen);
7204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly   }
7207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
7208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7210e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
7211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_U32 partial_frame = 1;
7213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
7214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BOOL isNewFrame = OMX_FALSE;
7215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
7216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (h264_scratch.pBuffer == NULL)
7218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
7220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
7221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
7223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
7224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
7225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (h264_scratch.nFilledLen && look_ahead_nal)
7226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    look_ahead_nal = false;
7228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         h264_scratch.nFilledLen)
7230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              h264_scratch.pBuffer,h264_scratch.nFilledLen);
7233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
7235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      h264_scratch.nFilledLen = 0;
7236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
7240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
7241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nal_length == 0)
7244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_sc_frame(psource_frame,
7247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
7248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
7251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
7256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_h264_nallength(psource_frame,
7257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
7258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
7260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
7261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (partial_frame == 0)
7265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
7267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
7269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nal_count++;
7270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
7271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nFlags = psource_frame->nFlags;
7272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
7276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(h264_scratch.nFilledLen)
7277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 NALU_TYPE_SPS);
7280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // If timeinfo is present frame info from SEI is already processed
7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
7288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
7290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_count++;
7291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
7292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nTimeStamp = h264_last_au_ts;
7293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFlags = h264_last_au_flags;
7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR
7295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_parser->update_panscan_data(h264_last_au_ts);
7297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
7300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = h264_scratch.nTimeStamp;
7302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_flags = h264_scratch.nFlags;
7303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
7306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
7307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (!VALID_TS(h264_last_au_ts))
7308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_last_au_ts = ts_in_sei;
7309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
7310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else
7312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = LLONG_MAX;
7313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!isNewFrame)
7316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen)
7319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
7321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.nFilledLen);
7322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.pBuffer,h264_scratch.nFilledLen);
7324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
7326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_scratch.nFilledLen = 0;
7328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
7330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
7332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
733573c229ebca57b299193c9634cd2c5f2145c1044dPraveen Chavan      else if(h264_scratch.nFilledLen)
7336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        look_ahead_nal = true;
7338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
7339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
7340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
7341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,frame_count++);
7342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pdest_frame->nFilledLen == 0)
7344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          look_ahead_nal = false;
7347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               h264_scratch.nFilledLen)
7349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
7352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            h264_scratch.nFilledLen = 0;
7354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
7356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
7358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            return OMX_ErrorBadParameter;
7359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
7364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Reset the EOS Flag");
7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /*Push the frame to the Decoder*/
7369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
7372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
7373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          //frame_count++;
7374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = NULL;
7375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_input_free_q.m_size)
7376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
7377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_input_free_q.pop_entry(&address,&p2,&id);
7378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
7379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
7380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen = 0;
7381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags = 0;
7382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = LLONG_MAX;
7383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
7391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if Destination Buffer is full*/
7392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_scratch.nAllocLen ==
7393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.nFilledLen + h264_scratch.nOffset)
7394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
7396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorStreamCorrupt;
7397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!psource_frame->nFilledLen)
7401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
7403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
7405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame)
7407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
7409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             h264_scratch.nFilledLen)
7411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7412068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian            if (pdest_frame->nFilledLen == 0)
7413068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian            {
7414068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                /* No residual frame from before, send whatever
7415068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                 * we have left */
7416068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7417068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                h264_scratch.pBuffer, h264_scratch.nFilledLen);
7418068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7419068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                h264_scratch.nFilledLen = 0;
742073c229ebca57b299193c9634cd2c5f2145c1044dPraveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
7421068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian            }
7422068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian            else
7423068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian            {
7424068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
7425068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                if (!isNewFrame)
7426068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                {
7427068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                    /* Have a residual frame, but we know that the
7428068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                     * AU in this frame is belonging to whatever
7429068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                     * frame we had left over.  So append it */
7430068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                    memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7431068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                    h264_scratch.pBuffer, h264_scratch.nFilledLen);
7432068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7433068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                    h264_scratch.nFilledLen = 0;
743473c229ebca57b299193c9634cd2c5f2145c1044dPraveen Chavan                    pdest_frame->nTimeStamp = h264_last_au_ts;
7435068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                }
7436068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                else
7437068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                {
7438068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                    /* Completely new frame, let's just push what
7439068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                     * we have now.  The resulting EBD would trigger
7440068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                     * another push */
7441068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                    generate_ebd = OMX_FALSE;
744273c229ebca57b299193c9634cd2c5f2145c1044dPraveen Chavan                    pdest_frame->nTimeStamp = h264_last_au_ts;
744373c229ebca57b299193c9634cd2c5f2145c1044dPraveen Chavan                    h264_last_au_ts = h264_scratch.nTimeStamp;
7444068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian                }
7445068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian            }
7446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
7450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7452068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian
7453068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian        /* Iff we coalesced two buffers, inherit the flags of both bufs */
7454068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian        if (generate_ebd == OMX_TRUE)
7455068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian        {
7456068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian            pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
7457068988d56501640533aafd9ff14fe09d39d496d6Deva Ramasubramanian        }
7458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
7459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (frame_count == 0)
7460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_HIGH("No frames sent to driver yet, "
7462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              "So send zero length EOS buffer");
7463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           pdest_frame->nFilledLen = 0;
7464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("pdest_frame->nFilledLen = %d, nFlags = 0x%x, TimeStamp = %x",
7467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen, pdest_frame->nFlags, pdest_frame->nTimeStamp);
7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
7469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
7473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!VALID_TS(pdest_frame->nTimeStamp))
7474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = ts_in_sei;
7475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Push the frame to the Decoder*/
7478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        frame_count++;
7483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = NULL;
7484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
7488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame,h264_scratch.nFilledLen);
7489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
7490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(generate_ebd && !psource_frame->nFilledLen)
7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psource_frame = NULL;
7497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_input_pending_q.m_size)
7498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
7500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_pending_q.pop_entry(&address,&p2,&id);
7501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
7503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame->nFlags,psource_frame->nFilledLen);
7504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
7507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7509e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
7510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U8 *buf, *pdest;
7512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U32 partial_frame = 1;
7513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U32 buf_len, dest_len;
7514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(first_frame == 0)
7516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        first_frame = 1;
7518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
7519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(!m_vendor_config.pData)
7520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
7522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            buf = psource_frame->pBuffer;
7523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            buf_len = psource_frame->nFilledLen;
7524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
7526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                VC1_SP_MP_START_CODE)
7527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7528e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_vc1_profile = VC1_SP_MP_RCV;
7529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
7531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_vc1_profile = VC1_AP;
7533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
7535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
7537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorStreamCorrupt;
7538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
7543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nOffset;
7544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
7545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nOffset);
7546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(dest_len < m_vendor_config.nDataSize)
7548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\nDestination buffer full\n");
7550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorBadParameter;
7551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
7553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
7555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
7556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch(m_vc1_profile)
7561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case VC1_AP:
7563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
7564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
7565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
7567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorBadParameter;
7568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
7570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case VC1_SP_MP_RCV:
7572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        default:
7573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n");
7574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            return OMX_ErrorBadParameter;
7575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
7577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
7580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
7581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_U32 alignment)
7582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct pmem_allocation allocation;
7584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  allocation.size = buffer_size;
7585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  allocation.align = clip2(alignment);
7586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (allocation.align < 4096)
7587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    allocation.align = 4096;
7589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
7591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
7594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return false;
7595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return true;
7597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7598090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly#endif
7599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
7602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
7603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	      struct ion_fd_data *fd_data,int flag)
7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int fd = -EINVAL;
7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -EINVAL;
7607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_dev_flag;
7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ion ion_buf_info;
7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!alloc_data || buffer_size <= 0 || !fd_data) {
7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return -EINVAL;
7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
761363a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  ion_dev_flag = O_RDONLY;
7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd = open (MEM_DEVICE, ion_dev_flag);
7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (fd < 0) {
7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return fd;
7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
761963a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  alloc_data->flags = 0;
762063a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  if (!secure_mode && (flag & ION_FLAG_CACHED))
762163a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  {
762263a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev    alloc_data->flags |= ION_FLAG_CACHED;
762363a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev  }
7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->len = buffer_size;
7625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->align = clip2(alignment);
7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (alloc_data->align < 4096)
7627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->align = 4096;
7629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
763063a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev
7631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(secure_mode) {
7632d86bc37a5f224788e86964745db14ee80cc326e2Rom Lemarchand    alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID);
763363a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev    alloc_data->flags |= ION_SECURE;
7634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7635d86bc37a5f224788e86964745db14ee80cc326e2Rom Lemarchand    alloc_data->heap_id_mask = (ION_HEAP(ION_IOMMU_HEAP_ID));
7636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
7638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc || !alloc_data->handle) {
7639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
7640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->handle = NULL;
7641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
7644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd_data->handle = alloc_data->handle;
7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_MAP,fd_data);
7647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc) {
7648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION MAP failed ");
7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_alloc_data = *alloc_data;
7650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_device_fd = fd;
7651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.fd_ion_data = *fd_data;
7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_ion_memory(&ion_buf_info);
7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd_data->fd =-1;
7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return fd;
7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
7662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(!buf_ion_info) {
7664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
7665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return;
7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
7668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             &buf_ion_info->ion_alloc_data.handle)) {
7669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free failed" );
7670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     close(buf_ion_info->ion_device_fd);
7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_device_fd = -1;
7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_alloc_data.handle = NULL;
7674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->fd_ion_data.fd = -1;
7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
7680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_use_buffer = false;
7681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ouput_egl_buffers = false;
7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (m_out_mem_ptr);
7686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = NULL;
7687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_platform_list)
7690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free(m_platform_list);
7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_platform_list = NULL;
7693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_respbuffer)
7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_respbuffer);
7698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = NULL;
7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_outputbuffer)
7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_outputbuffer);
7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = NULL;
7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
7717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (arbitrary_bytes)
7718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_inp_heap_ptr)
7720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input Heap Pointer");
7722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_inp_heap_ptr);
7723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_inp_heap_ptr = NULL;
7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_phdr_pmem_ptr)
7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
7729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_phdr_pmem_ptr);
7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_phdr_pmem_ptr = NULL;
7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_mem_ptr)
7734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (m_inp_mem_ptr);
7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_inp_mem_ptr = NULL;
7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
773989237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian
774089237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian    /* We just freed all the buffer headers, every thing in m_input_free_q
774189237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian     * is now invalid */
774289237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian    while (m_input_free_q.m_size)
774389237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian    {
774489237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian      unsigned address,p2,id;
774589237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian      m_input_free_q.pop_entry(&address,&p2,&id);
774689237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian    }
774789237c3f3c0f12e30fa3196fc010303df09e6773Deva Ramasubramanian
7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer)
7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Driver Context pointer");
7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (drv_ctx.ptr_inputbuffer);
7752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer = NULL;
7753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free ion context");
7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.ip_buf_ion_info);
7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
7764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int buf_size = 0, extra_data_size = 0;
7768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
7771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = buffer_prop;
7772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_GET_BUFFER_REQ,
7773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (void*)&ioctl_msg) < 0)
7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = buffer_prop->buffer_size;
7781355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan
7782355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    ioctl_msg.in = NULL;
7783355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    ioctl_msg.out = &drv_ctx.video_resolution;
7784355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg))
7785355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    {
7786355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan      DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
7787355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan      eRet = OMX_ErrorHardware;
7788355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan      return eRet;
7789355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    }
7790355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    else
7791355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    {
7792355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan        update_resolution(drv_ctx.video_resolution.frame_width,
7793355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan            drv_ctx.video_resolution.frame_height);
7794355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan    }
7795355146b35a7f170e8e71e76d0850e41dbe6be9a1Praveen Chavan
7796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
7799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
7800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_INTERLACE_EXTRADATA)
7802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Interlace extra data enabled!");
7804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
7805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_PORTDEF_EXTRADATA)
7807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         extra_data_size);
7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (extra_data_size)
7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
7815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
7816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size += extra_data_size;
7818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
7820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
7821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig) // BufReq will be set to driver when port is disabled
7822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (buf_size != buffer_prop->buffer_size)
7824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = set_buffer_req(buffer_prop);
7827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
7830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
7835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned buf_size = 0;
7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buf_size != buffer_prop->buffer_size)
7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size, buf_size);
7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadParameter;
7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = buffer_prop;
7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_BUFFER_REQ,
7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (void*)&ioctl_msg) < 0)
7854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Setting buffer requirements failed");
7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInsufficientResources;
785740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
785840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!client_buffers.update_buffer_req()) {
785940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
786040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        eRet = OMX_ErrorInsufficientResources;
786140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      }
7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::start_port_reconfig()
7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  eRet = update_picture_resolution();
7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone)
7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = &drv_ctx.interlace;
7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_INTERLACE_FORMAT, &ioctl_msg))
7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_INTERLACE_FORMAT");
7878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorHardware;
7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("Interlace format detected (%x)!", drv_ctx.interlace);
7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
7886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            client_extradata |= OMX_INTERLACE_EXTRADATA;
7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("secure mode interlaced format not supported");
7889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      in_reconfig = true;
7893ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
7894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
7895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = get_buffer_req(&op_buf_rcnfg);
7896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7897ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan    if (m_use_smoothstreaming) {
7898ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        if (drv_ctx.video_resolution.frame_width > kMaxSmoothStreamingWidth ||
7899ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                drv_ctx.video_resolution.frame_height > kMaxSmoothStreamingHeight) {
7900ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            DEBUG_PRINT_ERROR("NOTE: Exceeds max smoothstreaming resolution");
7901ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            eRet = OMX_ErrorInsufficientResources;
7902ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        } else {
7903ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            if (drv_ctx.video_resolution.frame_width > m_smoothstreaming_width)
7904ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                m_smoothstreaming_width = drv_ctx.video_resolution.frame_width;
7905ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            if (drv_ctx.video_resolution.frame_height > m_smoothstreaming_height)
7906ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                m_smoothstreaming_height = drv_ctx.video_resolution.frame_height;
7907ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
7908ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan            DEBUG_PRINT_HIGH("Port Settings changed : "
7909ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    "Will continue smoosthtreaming @ [%u x %u]",
7910ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan                    m_smoothstreaming_width, m_smoothstreaming_height);
7911ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan        }
7912ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan    }
7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = &drv_ctx.video_resolution;
7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg))
7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorHardware;
7927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7928ac64d24c26fd060fb3e2b1c9a1db4ab18dbf7c5dPraveen Chavan
7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!portDefn)
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nSize = sizeof(portDefn);
7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->eDomain    = OMX_PortDomainVideo;
7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.frame_rate.fps_denominator > 0)
7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
7945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        drv_ctx.frame_rate.fps_denominator;
7946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else {
7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (0 == portDefn->nPortIndex)
7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirInput;
7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = eCompressionFormat;
7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_inp_bEnabled;
7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_inp_bPopulated;
7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (1 == portDefn->nPortIndex)
7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirOutput;
7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (update_picture_resolution() != OMX_ErrorNone)
7965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ALOGE(" update_picture_resolution failed \n");
7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorHardware;
7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
796940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.update_buffer_req()) {
797040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
797140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
797240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig)
7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = op_buf_rcnfg.mincount;
7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = op_buf_rcnfg.buffer_size;
7978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = drv_ctx.op_buf.buffer_size;
7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
798540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    unsigned int buf_size = 0;
798640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.get_buffer_req(buf_size)) {
798740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n update buffer requirements");
798840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
798940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
799040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    portDefn->nBufferSize = buf_size;
7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
7992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_out_bEnabled;
7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_out_bPopulated;
799440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
799540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Error in getting color format");
799640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir = OMX_DirMax;
8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->nPortIndex);
8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
8008d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  portDefn->format.video.nStride = client_buffers.get_output_stride();
8009d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  portDefn->format.video.nSliceHeight = client_buffers.get_output_scanlines();
8010d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("update_portdef Width = %d Height = %d Stride = %u"
8012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "SliceHeight = %u \n", portDefn->format.video.nFrameHeight,
8013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nFrameWidth,
8014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nStride,
8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nSliceHeight);
8016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
8023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i= 0;
8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_out_mem_ptr) {
8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nBufHdrSize        = 0;
8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformEntrySize = 0;
8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformListSize  = 0;
8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPMEMInfoSize = 0;
8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
8037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
8038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
8039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
8040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
8042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
8043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
8044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
8045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
8046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
8047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE),
8050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPMEMInfoSize,
8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPlatformListSize);
8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         m_out_bm_count);
8054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Alloc mem for platform specific info
8056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *pPtr=NULL;
8057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
8058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     nPMEMInfoSize,1);
8059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
8060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
8061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
8062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
8063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
8064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
8065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
8067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
8068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
8071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer)
8072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufHdr          =  m_out_mem_ptr;
8074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
8075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
8076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_list)  + nPlatformListSize);
8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_entry) + nPlatformEntrySize);
8079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList   = m_platform_list;
8080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry  = m_platform_entry;
8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo       = m_pmem_info;
8082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
8084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Settting the entire storage nicely
8086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
8087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_ptr,pPlatformEntry);
8088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
8093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Set the values when we determine the right HxW param
8094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
8095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nFilledLen         = 0;
8096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
8097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
8098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->entry      = pPMEMInfo;
8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform List
8101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->nEntries    = 1;
8102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->entryList   = pPlatformEntry;
8103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep pBuffer NULL till vdec is opened
8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pBuffer            = NULL;
8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
8106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->pmem_fd = 0;
8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pPlatformPrivate = pPlatformList;
8108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
8111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Create a mapping between buffers*/
8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
8115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Move the buffer and buffer header pointers
8117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr++;
8118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo++;
8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry++;
8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList++;
8121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
8126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        m_out_mem_ptr, pPtr);
8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_out_mem_ptr)
8128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_out_mem_ptr);
8130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_out_mem_ptr = NULL;
8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPtr)
8133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPtr);
8135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPtr = NULL;
8136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
8138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
8140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
8141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
8143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
8145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
8149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
8150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
8151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
8152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =  OMX_ErrorInsufficientResources;
8155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
8157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet =  OMX_ErrorInsufficientResources;
8158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
8163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p1;
8165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p2;
8166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned ident;
8167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_cmd_queue tmp_q, pending_bd_q;
8168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
8169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE FDB from ftb queue
8170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_ftb_q.m_size)
8171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.pop_entry(&p1,&p2,&ident);
8173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_FBD)
8174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
8176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
8180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to ftb queue
8183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
8184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
8186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.insert_entry(p1,p2,ident);
8187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE EDB from etb queue
8189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_etb_q.m_size)
8190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.pop_entry(&p1,&p2,&ident);
8192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_EBD)
8193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
8195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
8199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to etb queue
8202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
8203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
8205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.insert_entry(p1,p2,ident);
8206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
8208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // process all pending buffer dones
8209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(pending_bd_q.m_size)
8210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_bd_q.pop_entry(&p1,&p2,&ident);
8212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(ident)
8213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_EBD:
8215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
8216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
8218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
8219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
8221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_FBD:
8223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
8224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
8226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
8227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
8229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
8234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 new_frame_interval = 0;
8236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
8237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
8238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
8239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    new_frame_interval = (act_timestamp > prev_ts)?
8241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          act_timestamp - prev_ts :
8242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          prev_ts - act_timestamp;
8243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (new_frame_interval < frm_int || frm_int == 0)
8244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frm_int = new_frame_interval;
8246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(frm_int)
8247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_numerator = 1e6;
8249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_denominator = frm_int;
8250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
8251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         frm_int, drv_ctx.frame_rate.fps_numerator /
8252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         (float)drv_ctx.frame_rate.fps_denominator);
8253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl_msg.in = &drv_ctx.frame_rate;
8254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
8255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (void*)&ioctl_msg) < 0)
8256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("Setting frame rate failed");
8258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prev_ts = act_timestamp;
8263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
8266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rst_prev_ts && VALID_TS(act_timestamp))
8268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = act_timestamp;
8270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = false;
8271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (VALID_TS(prev_ts))
8273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bool codec_cond = (drv_ctx.timestamp_adjust)?
8275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
8276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
8277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
8278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(frm_int > 0 && codec_cond)
8279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
8281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      act_timestamp = prev_ts + frm_int;
8282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
8283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = act_timestamp;
8284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(act_timestamp);
8287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (frm_int > 0)           // In this case the frame rate was set along
8289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {                               // with the port definition, start ts with 0
8290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
8291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
8292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
8298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_conceal_MB = 0;
8299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_S64 ts_in_sei = 0;
8300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 frame_rate = 0;
8301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8302edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
8303edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
8304edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
8305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_extra = (OMX_OTHER_EXTRADATATYPE *)
8306edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George           ((unsigned)(pBuffer + p_buf_hdr->nOffset +
8307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_buf_hdr->nFilledLen + 3)&(~3));
8308edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
8309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = NULL;
8310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
8311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Process driver extradata
8313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
8314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
8316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->nSize < p_extra->nDataSize)
8318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          p_extra->nSize, p_extra->nDataSize);
8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8322edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George        if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
8323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_extra->nDataSize == 0 || p_extra->nSize == 0)
8324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra = NULL;
8325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          continue;
8326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
8328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
8330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          num_conceal_MB = count_MB_in_extradata(p_extra);
8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
8332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Map driver extradata to corresponding OMX type
8333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
8334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
8335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_debug_concealedmb) {
8338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
8339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
8341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_SEI)
8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_sei = p_extra;
8345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_VUI)
8351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_vui = p_extra;
8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
8355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      print_debug_extradata(p_extra);
8359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8360edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George      if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->nDataSize == 0 || p_extra->nSize == 0)
8362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = NULL;
8363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
8365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Driver extradata is only exposed if MB map is requested by client,
8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // otherwise can be overwritten by omx extradata.
8368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *)
8369edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George               ((unsigned)(pBuffer + p_buf_hdr->nOffset +
8370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                p_buf_hdr->nFilledLen + 3)&(~3));
8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
8372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
8376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_TIMEINFO_EXTRADATA)
8379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_vui)
8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
8382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_sei)
8383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!VALID_TS(p_buf_hdr->nTimeStamp))
8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp = ts_in_sei;
8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // If timeinfo is present frame info from SEI is already processed
8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
8394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
8395edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_interlace_extradata(p_extra,
8399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format);
8400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
8403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
8404edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* vui extra data (frame_rate) information */
8408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
8409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_rate(&frame_rate);
8410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_frame_info_extradata(p_extra, num_conceal_MB,
8411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
8412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp, frame_rate,
8413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &((struct vdec_output_frameinfo *)
8414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
8415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
8418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       p_extra != NULL &&
8419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
8420edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_portdef_extradata(p_extra);
8424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
8427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (p_extra &&
8428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
8429edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George        (pBuffer + p_buf_hdr->nAllocLen))
8430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      append_terminator_extradata(p_extra);
8431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
8434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
8435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
8439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
8441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 driver_extradata = 0, extradata_size = 0;
8442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
8443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state != OMX_StateLoaded)
8444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
8446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorIncorrectStateOperation;
8447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
8449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
8450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_INTERLACE_EXTRADATA)
8451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
8452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_PORTDEF_EXTRADATA)
8453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
8455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
8457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata, requested_extradata, enable);
8458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (enable)
8460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata |= client_extradata;
8461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata = client_extradata & ~requested_extradata;
8464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size *= -1;
8465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
8468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
8469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
8470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
8471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
8474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
8475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
8476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
8477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (driver_extradata != drv_ctx.extradata)
8481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.extradata = driver_extradata;
8484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.extradata;
8485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
8486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
8487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (void*)&ioctl_msg) < 0)
8488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nSet extradata failed");
8490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = OMX_ErrorUnsupportedSetting;
8491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ret = get_buffer_req(&drv_ctx.op_buf);
8494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
8496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_size += extradata_size;
8499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // align the buffer size
8500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1));
8501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size);
8502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
8503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
8504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = set_buffer_req(&drv_ctx.op_buf);
8505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
8507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
8512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *data_ptr = extra->data, data = 0;
8513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (byte_count < extra->nDataSize)
8514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data = *data_ptr;
8516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (data)
8517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      num_MB += (data&0x01);
8519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      data >>= 1;
8520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data_ptr++;
8522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    byte_count++;
8523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
8525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
8526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
8527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_debug_extradata)
8533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return;
8534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH(
8536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "============== Extra Data ==============\n"
8537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Size: %u \n"
8538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "        Version: %u \n"
8539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "      PortIndex: %u \n"
8540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Type: %x \n"
8541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "       DataSize: %u \n",
8542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nSize, extra->nVersion.nVersion,
8543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nPortIndex, extra->eType, extra->nDataSize);
8544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (extra->eType == OMX_ExtraDataInterlaceFormat)
8546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "------ Interlace Format ------\n"
8550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "                Size: %u \n"
8551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Version: %u \n"
8552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           PortIndex: %u \n"
8553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Is Interlace Format: %u \n"
8554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Interlace Formats: %u \n"
8555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "=========== End of Interlace ===========\n",
8556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
8557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
8558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataFrameInfo)
8560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "-------- Frame Format --------\n"
8565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Picture Type: %u \n"
8566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Interlace Type: %u \n"
8567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Pan Scan Total Frame Num: %u \n"
8568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Concealed Macro Blocks: %u \n"
8569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "               frame rate: %u \n"
8570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio X: %u \n"
8571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio Y: %u \n",
8572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->ePicType,
8573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->interlaceType,
8574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->panScan.numWindows,
8575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nConcealedMacroblocks,
8576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nFrameRate,
8577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioX,
8578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioY);
8579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (int i = 0; i < fminfo->panScan.numWindows; i++)
8581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH(
8583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "------------------------------\n"
8584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "     Pan Scan Frame Num: %d \n"
8585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle x: %d \n"
8586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle y: %d \n"
8587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dx: %d \n"
8588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dy: %d \n",
8589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
8590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
8591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
8594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataNone)
8596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
8598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
8602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
8604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_U32 interlaced_format_type)
8608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STREAMINTERLACEFORMAT *interlace_format;
8610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 mbaff = 0;
8611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
8612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
8615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
8619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
8621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((interlaced_format_type == VDEC_InterlaceFrameProgressive)  && !mbaff)
8622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_FALSE;
8624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
8625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
8626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_TRUE;
8630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
8631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
8632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp,
8638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 frame_rate, struct vdec_aspectratioinfo *aspect_ratio_info)
8639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
8641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
8642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
8645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
8646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (picture_type)
8649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_I:
8651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
8652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_P:
8654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
8655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_B:
8657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
8658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
8660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
8661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
8663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
8664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
8665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
8666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
8668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->panScan,0,sizeof(frame_info->panScan));
8669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
8670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
8673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fill_aspect_ratio_info(aspect_ratio_info, frame_info);
8676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nConcealedMacroblocks = num_conceal_mb;
8677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nFrameRate = frame_rate;
8678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::fill_aspect_ratio_info(
8682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       struct vdec_aspectratioinfo *aspect_ratio_info,
8683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
8684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata = frame_info;
8686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata->aspectRatio.aspectRatioX = 0;
8688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata->aspectRatio.aspectRatioY = 0;
8689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     h264_parser->fill_aspect_ratio_info(&m_extradata->aspectRatio);
8693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG4 ||
8696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_3 ||
8697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4 ||
8698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5 ||
8699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_6)
8700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      mp4_fill_aspect_ratio_info(aspect_ratio_info,m_extradata);
8702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_extradata->aspectRatio.aspectRatioX == 0 ||
8705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_extradata->aspectRatio.aspectRatioY == 0) {
8706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_extradata->aspectRatio.aspectRatioX = 1;
8707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_extradata->aspectRatio.aspectRatioY = 1;
8708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
8714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
8715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
8718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
8719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
8720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  *portDefn = m_port_def;
8721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
8722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
8723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nFrameWidth,
8724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nStride,
8725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nSliceHeight);
8726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
8731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = OMX_ExtraDataNone;
8733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = 0;
8734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->data[0] = 0;
8735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
8740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
8742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index >= drv_ctx.ip_buf.actualcount)
8743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
8745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr = (desc_buffer_hdr*) \
8750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(desc_buffer_hdr)),
8751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
8752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_desc_buffer_ptr == NULL)
8753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
8755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
8760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr[index].buf_addr == NULL)
8761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
8763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
8770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
8772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_demux_entries < 8192)
8773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_offsets[m_demux_entries++] = address_offset;
8775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
8780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
8782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
8783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 index = 0;
8784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (index < bytes_to_parse)
8788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
8791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x01)) )
8793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //Found start code, insert address offset
8795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      insert_demux_addr_offset(index);
8796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf[index+2] == 0x01) // 3 byte start code
8797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 3;
8798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else                      //4 byte start code
8799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 4;
8800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index++;
8803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
8805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //fix this, handle 3 byte start code, vc1 terminator entry
8811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *p_demux_data = NULL;
8812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 desc_data = 0;
8813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 start_addr = 0;
8814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 nal_size = 0;
8815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 suffix_byte = 0;
8816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 demux_index = 0;
8817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 buffer_index = 0;
8818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
8822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
8826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer_index > drv_ctx.ip_buf.actualcount)
8827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index);
8829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
8833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ( ((OMX_U8*)p_demux_data == NULL) ||
8835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
8836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
8838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (; demux_index < m_demux_entries; demux_index++)
8843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      start_addr = m_demux_offsets[demux_index];
8846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
8847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
8849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
8853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (demux_index < (m_demux_entries - 1))
8855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
8857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
8861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
8863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        start_addr,
8864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        suffix_byte,
8865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nal_size,
8866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        demux_index);
8867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = (start_addr >> 3) << 1;
8868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= (start_addr & 7) << 21;
8869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= suffix_byte << 24;
8870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
8873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (codec_type_parse == CODEC_TYPE_VC1)
8879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("VC1 terminator entry");
8881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0x82 << 24;
8883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
8885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_demux_entries++;
8889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //Add zero word to indicate end of descriptors
8891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(p_demux_data, 0, sizeof(OMX_U32));
8892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
8894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
8895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
8897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Demux table complete!");
8899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
8900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::vdec_alloc_h264_mv()
8904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 pmem_fd = -1;
8906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 width, height, size, alignment;
8907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  void *buf_addr = NULL;
8908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg;
8909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
8910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem_allocation allocation;
8911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_h264_mv h264_mv;
8913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_mv_buff_size mv_buff_size;
8914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mv_buff_size.width = drv_ctx.video_resolution.stride;
8916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mv_buff_size.height = drv_ctx.video_resolution.scan_lines>>2;
8917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
8919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = (void*)&mv_buff_size;
8920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_GET_MV_BUFFER_SIZE, (void*)&ioctl_msg) < 0)
8922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n GET_MV_BUFFER_SIZE Failed for width: %d, Height %d" ,
8924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      mv_buff_size.width, mv_buff_size.height);
8925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("GET_MV_BUFFER_SIZE returned: Size: %d and alignment: %d",
8929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    mv_buff_size.size, mv_buff_size.alignment);
8930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  size = mv_buff_size.size * drv_ctx.op_buf.actualcount;
8932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alignment = mv_buff_size.alignment;
8933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Entered vdec_alloc_h264_mv act_width: %d, act_height: %d, size: %d, alignment %d\n",
8935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height,size,alignment);
8936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.h264_mv.ion_device_fd = alloc_map_ion_memory(
8940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    size, 8192,
8941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.h264_mv.ion_alloc_data,
894263a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev                    &drv_ctx.h264_mv.fd_ion_data,ION_FLAG_CACHED);
8943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.h264_mv.ion_device_fd < 0) {
8944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
8945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = drv_ctx.h264_mv.fd_ion_data.fd;
8947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
8948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.size = size;
8949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.align = clip2(alignment);
8950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (allocation.align != 8192)
8951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    allocation.align = 8192;
8952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = open(MEM_DEVICE, O_RDWR);
8954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((int)(pmem_fd) < 0)
8956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
8959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
8961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
8962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode) {
8966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_addr = mmap(NULL, size,
8967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   PROT_READ | PROT_WRITE,
8968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   MAP_SHARED, pmem_fd, 0);
8969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf_addr == (void*) MAP_FAILED)
8971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        close(pmem_fd);
8973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free_ion_memory(&drv_ctx.h264_mv);
8975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_fd = -1;
8977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
8978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
8979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   } else
8981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_addr =(unsigned char *) (pmem_fd + 1234);
8982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Allocated virt:%p, FD: %d of size %d count: %d \n", buf_addr,
8983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   pmem_fd, size, drv_ctx.op_buf.actualcount);
8984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.size = size;
8986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.count = drv_ctx.op_buf.actualcount;
8987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.pmem_fd = pmem_fd;
8988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.offset = 0;
8989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = (void*)&h264_mv;
8991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
8992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_H264_MV_BUFFER, (void*)&ioctl_msg) < 0)
8994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Failed to set the H264_mv_buffers\n");
8996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.buffer = (unsigned char *) buf_addr;
9000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.size = size;
9001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.count = drv_ctx.op_buf.actualcount;
9002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.offset = 0;
9003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.pmem_fd = pmem_fd;
9004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Saving virt:%p, FD: %d of size %d count: %d \n", h264_mv_buff.buffer,
9005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   h264_mv_buff.pmem_fd, h264_mv_buff.size, drv_ctx.op_buf.actualcount);
9006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
9007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::vdec_dealloc_h264_mv()
9010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
9011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(h264_mv_buff.pmem_fd > 0)
9012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
9013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_H264_MV_BUFFER,NULL) < 0)
9014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_H264_MV_BUFFER failed");
9015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
9016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          munmap(h264_mv_buff.buffer, h264_mv_buff.size);
9017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(h264_mv_buff.pmem_fd);
9018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
9019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free_ion_memory(&drv_ctx.h264_mv);
9020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
9021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Cleaning H264_MV buffer of size %d \n",h264_mv_buff.size);
9022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.pmem_fd = -1;
9023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.offset = 0;
9024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.size = 0;
9025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.count = 0;
9026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.buffer = NULL;
9027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
9031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
9033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::createDivxDrmContext()
9034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
9035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = OMX_ErrorNone;
9036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     iDivXDrmDecrypt = DivXDrmDecrypt::Create();
9037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (iDivXDrmDecrypt) {
9038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
9039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(err!=OMX_ErrorNone) {
9040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
9041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
9042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
9043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
9044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
9045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
9046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
9047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          err = OMX_ErrorUndefined;
9048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
9049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return err;
9050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
9051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
9052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
905340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
905440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
905540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  enabled = false;
9056d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  m_native_buffers_enabled = false;
905740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx = NULL;
905840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  init_members();
905940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  ColorFormat = OMX_COLOR_FormatMax;
90603072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan  dest_format = YCbCr420P;
906140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
906240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
906340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
906440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
906540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx = reinterpret_cast<omx_vdec*>(client);
906640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
906740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
906840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::init_members() {
906940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  allocated_count = 0;
907040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer_size_req = 0;
907140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer_alignment_req = 0;
907240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_platform_list_client,0,sizeof(m_platform_list_client));
907340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
907440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
907540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
907640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
907740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  for (int i = 0; i < MAX_COUNT;i++)
907840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    pmem_fd[i] = -1;
907940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
908040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
908140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
908240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  c2d.destroy();
908340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
908440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
908540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::update_buffer_req()
908640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
908740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
908840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int src_size = 0, destination_size = 0;
908940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE drv_color_format;
909040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
909140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
909240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
909340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
909440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled){
909540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n No color conversion required");
909640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return status;
909740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
909840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_TILE_4x2 &&
909940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      ColorFormat != OMX_COLOR_FormatYUV420Planar) {
910040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
910140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
910240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
91035eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan  pthread_mutex_lock(&omx->c_lock);
910440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  c2d.close();
910540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
9106d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan                omx->drv_ctx.video_resolution.frame_width,
9107d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan                YCbCr420Tile, dest_format);
910840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status) {
910940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    status = c2d.get_buffer_size(C2D_INPUT,src_size);
911040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (status)
911140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
911240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
911340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status) {
911440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
911540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        !destination_size) {
911640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
911740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            "driver size %d destination size %d",
911840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
911940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
912040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      c2d.close();
912140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      buffer_size_req = 0;
912240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
912340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      buffer_size_req = destination_size;
912440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
912540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George	     buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
912640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
912740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
912840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
912940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
91305eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan  pthread_mutex_unlock(&omx->c_lock);
913140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
913240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
913340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
913440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::set_color_format(
913540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE dest_color_format)
913640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
913740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
913840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE drv_color_format;
913940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
914040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
914140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
914240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
914340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
914440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    drv_color_format = (OMX_COLOR_FORMATTYPE)
914540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
914640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else {
914740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Incorrect color format");
914840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    status = false;
914940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
91505eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan  pthread_mutex_lock(&omx->c_lock);
915140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status && (drv_color_format != dest_color_format)) {
91523072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan    if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) &&
91533072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan        (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) {
915440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
915540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
915640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
915757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      DEBUG_PRINT_HIGH("\n Planar color format set");
91583072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan      ColorFormat = dest_color_format;
91593072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan      dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ?
91603072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan              YCbCr420P : YCbCr420SP;
91613072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan      ALOGI("C2D o/p color format = %x", dest_color_format);
916240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (enabled)
916340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        c2d.destroy();
916440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      enabled = false;
916540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!c2d.init()) {
916640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("\n open failed for c2d");
916740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        status = false;
916840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      } else
916940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        enabled = true;
917040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
917140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  } else {
917240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (enabled)
917340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      c2d.destroy();
917440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    enabled = false;
917540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
91765eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan  pthread_mutex_unlock(&omx->c_lock);
917740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
917840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
917940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
918040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
918140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
918240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
918340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
918440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
918540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
918640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
918740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return omx->m_out_mem_ptr;
918840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return m_out_mem_ptr_client;
918940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
919040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
919140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
919240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George       (OMX_BUFFERHEADERTYPE *bufadd)
919340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
919440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
919540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
919640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
919740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
919840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
919940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return bufadd;
920040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned index = 0;
920140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufadd - omx->m_out_mem_ptr;
920240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index < omx->drv_ctx.op_buf.actualcount) {
920340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
920440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
920540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    bool status;
920640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!omx->in_reconfig && !omx->output_flush_progress) {
92075eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan      pthread_mutex_lock(&omx->c_lock);
920840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
9209a894212fba3d7b69ee716b3224355d083f278d41Praveen Chavan                  bufadd->pBuffer, bufadd->pBuffer, pmem_fd[index],
9210a894212fba3d7b69ee716b3224355d083f278d41Praveen Chavan                  pmem_baseaddress[index], pmem_baseaddress[index]);
9211d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan// DEBUG: dump converted output
9212d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan#if 0
9213d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      {
9214d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          int w = get_output_stride();
9215d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          int h = get_output_scanlines();
9216d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          char fileName[128] = {0};
9217d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          sprintf(fileName,"/data/misc/media/out_%d_%d.yuv",w,h);
9218d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          FILE* fp = fopen(fileName,"ab");
9219d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          if (fp) {
9220d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan              ALOGI("c2d: dumped: %s",fileName);
9221d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan              fwrite(pmem_baseaddress[index], (w * h * 3)/2, 1, fp);
9222d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan              fclose(fp);
9223d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          }
9224d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      }
9225d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan#endif
92265eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan      pthread_mutex_unlock(&omx->c_lock);
922740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
922840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!status){
922940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
92305eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan        m_out_mem_ptr_client[index].nFilledLen = 0;
92315eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan        return &m_out_mem_ptr_client[index];
923240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      }
923340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else
923440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_out_mem_ptr_client[index].nFilledLen = 0;
923540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return &m_out_mem_ptr_client[index];
923640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
923740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
923840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return NULL;
923940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
924040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
924140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
924240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                                              (OMX_BUFFERHEADERTYPE *bufadd)
924340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
924440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
924540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
924640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
924740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
924840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
924940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return bufadd;
925040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned index = 0;
925140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufadd - m_out_mem_ptr_client;
925240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index < omx->drv_ctx.op_buf.actualcount) {
925340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return &omx->m_out_mem_ptr[index];
925440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
925540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
925640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return NULL;
925740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
925840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_buffer_req
925940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          (unsigned int &buffer_size)
926040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
926140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
926240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    buffer_size = omx->drv_ctx.op_buf.buffer_size;
92635eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan  else {
92645eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
926540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
926640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Get buffer size failed");
92675eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan      pthread_mutex_unlock(&omx->c_lock);
926840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return false;
92695eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan    }
92705eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
927140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
927240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
927340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        buffer_size = omx->drv_ctx.op_buf.buffer_size;
927440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
927540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George	  buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
927640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return true;
927740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
9278d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
9279d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen ChavanOMX_U32 omx_vdec::allocate_color_convert_buf::get_output_stride() {
9280d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  // If Converting to Planar/SemiPlanar in bytebuffer mode, stride/slice-height
9281d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  //  are not aligned per hardware restrictions.
9282d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  if (enabled &&
9283d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          (ColorFormat == OMX_COLOR_FormatYUV420Planar ||
9284d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
9285d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      return ALIGN(omx->drv_ctx.video_resolution.frame_width, ALIGN16);
9286d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  } else {
9287d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      return omx->drv_ctx.video_resolution.stride;
9288d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  }
9289d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan}
9290d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
9291d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen ChavanOMX_U32 omx_vdec::allocate_color_convert_buf::get_output_scanlines() {
9292d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  // If Converting to Planar/SemiPlanar in bytebuffer mode, stride/slice-height
9293d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  //  are not aligned per hardware restrictions.
9294d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  if (enabled &&
9295d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          (ColorFormat == OMX_COLOR_FormatYUV420Planar ||
9296d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
9297d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      return omx->drv_ctx.video_resolution.frame_height;
9298d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  } else {
9299d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      return omx->drv_ctx.video_resolution.scan_lines;
9300d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  }
9301d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan}
9302d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
930340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
930440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE *bufhdr) {
930540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int index = 0;
930640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
930740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
930840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return omx->free_output_buffer(bufhdr);
930940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (enabled && omx->is_component_secure())
931040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorNone;
931140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!allocated_count || !bufhdr) {
931240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
931340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
931440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
931540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufhdr - m_out_mem_ptr_client;
931640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index >= omx->drv_ctx.op_buf.actualcount){
931740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
931840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
931940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
9320d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  if (m_native_buffers_enabled) {
9321d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      // unmap client's fd
9322d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      if (pmem_fd[index] > 0 && pmem_baseaddress[index]) {
9323d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          munmap(pmem_baseaddress[index], buffer_size_req);
9324d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          pmem_baseaddress[index] = 0;
9325d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      }
9326d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      // free from internal set
9327d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      // Do this explicitly as omx->free_output_buffer() does not free
9328d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      //  the memory when native-buffers are enabled
9329d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      if (omx->drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
9330d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          DEBUG_PRINT_LOW("free_buffer(conversion): free ion mem[%d] fd=%d size=%d",
9331d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan                  index, omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
9332d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan                  omx->drv_ctx.ptr_outputbuffer[index].mmaped_size);
9333d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          munmap (omx->drv_ctx.ptr_outputbuffer[index].bufferaddr,
9334d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan                  omx->drv_ctx.ptr_outputbuffer[index].mmaped_size);
9335d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          omx->free_ion_memory(&(omx->drv_ctx.op_buf_ion_info[index]));
9336d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          close (omx->drv_ctx.ptr_outputbuffer[index].pmem_fd);
9337d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan          omx->drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
9338d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      }
9339d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan  } else {
9340d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      if (pmem_fd[index] > 0) {
9341d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        munmap(pmem_baseaddress[index], buffer_size_req);
9342d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        close(pmem_fd[index]);
9343d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      }
9344d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      pmem_fd[index] = -1;
9345d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan      omx->free_ion_memory(&op_buf_ion_info[index]);
934640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
934740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_heap_ptr[index].video_heap_ptr = NULL;
934840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (allocated_count > 0)
934940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    allocated_count--;
935040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else
935140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    allocated_count = 0;
935240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!allocated_count) {
93535eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
935440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    c2d.close();
935540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    init_members();
93565eec611637d93f8e43579337ca2e45a3014d9237Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
935740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
935840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
935940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
936040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
936140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
936240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
936340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
936440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_ERRORTYPE eRet = OMX_ErrorNone;
936540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled){
936640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
936740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return eRet;
936840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
936940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (enabled && omx->is_component_secure()) {
937040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
937140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                      omx->is_component_secure());
937240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorUnsupportedSetting;
937340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
937440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!bufferHdr || bytes > buffer_size_req) {
937540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
937640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %d",
937740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                      buffer_size_req,bytes);
937840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
937940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
938040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
938140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
938240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
938340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
938440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
938540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
938640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George         port,appData,omx->drv_ctx.op_buf.buffer_size);
938740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (eRet != OMX_ErrorNone || !temp_bufferHdr){
938840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
938940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return eRet;
939040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
939140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
939240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      omx->drv_ctx.op_buf.actualcount) {
939340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid header index %d",
939440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             (temp_bufferHdr - omx->m_out_mem_ptr));
939540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorUndefined;
939640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
939740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int i = allocated_count;
939840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
939940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    buffer_size_req,buffer_alignment_req,
940063a6c9bcb0bb20a516059e74ec4113b541f5e919Iliyan Malchev    &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
94018dac2f1932988a8a2ac17b2dce59110d589a5e62Praveen Chavan    0);
940240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
940340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
940440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (op_buf_ion_info[i].ion_device_fd < 0) {
940540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
940640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
940740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
940840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
940940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                     PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
941040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
941140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (pmem_baseaddress[i] == MAP_FAILED) {
941240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
941340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    close(pmem_fd[i]);
941440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    omx->free_ion_memory(&op_buf_ion_info[i]);
941540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
941640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
941740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_heap_ptr[i].video_heap_ptr = new VideoHeap (
941840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    op_buf_ion_info[i].ion_device_fd,buffer_size_req,
941940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
942040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
942140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_pmem_info_client[i].offset = 0;
942240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
942340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
942440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_list_client[i].nEntries = 1;
942540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_list_client[i].entryList = &m_platform_entry_client[i];
942640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
942740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
942840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nFilledLen = 0;
942940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nFlags = 0;
943040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
943140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
943240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
943340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
943440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
943540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pAppPrivate = appData;
943640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  *bufferHdr = &m_out_mem_ptr_client[i];
943740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
943840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  allocated_count++;
943940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return eRet;
944040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
944140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
9442d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen ChavanOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::use_output_buffer(OMX_HANDLETYPE hComp,
9443d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr, OMX_U32 port, OMX_PTR appData,
9444d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        OMX_U32 bytes, OMX_U8 *buffer)
9445d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan{
9446d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
9447d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    const char *func = "use_buf(conversion)";
9448d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
9449d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if (!enabled) {
9450d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return omx->use_output_buffer(hComp, bufferHdr, port, appData, bytes, buffer);
9451d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9452d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    // assert native-buffer-mode is enabled
9453d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if (!m_native_buffers_enabled) {
9454d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_ERROR("%s: use_buffer called in non-surface mode", func);
9455d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return OMX_ErrorUnsupportedSetting;
9456d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9457d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if (omx->is_component_secure()) {
9458d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_ERROR("%s: Cannot color-convert secure buffers", func);
9459d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return OMX_ErrorUnsupportedSetting;
9460d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9461d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if (!bufferHdr || bytes > buffer_size_req) {
9462d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_ERROR("%s: Invalid params hdr=%p requested-size=%d passed-size=%d",
9463d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan                func, bufferHdr, buffer_size_req, bytes);
9464d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return OMX_ErrorBadParameter;
9465d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9466d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
9467d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_ERROR("%s: all buffers (%d) already allocated", func, allocated_count);
9468d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return OMX_ErrorInsufficientResources;
9469d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9470d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
9471d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    // Allocate pixel buffer for the decoder
9472d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
9473d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    eRet = omx->allocate_output_buffer(hComp, &temp_bufferHdr,
9474d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan             port, appData, omx->drv_ctx.op_buf.buffer_size);
9475d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if (eRet != OMX_ErrorNone || !temp_bufferHdr){
9476d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_ERROR("%s: decoder's o/p allocation failed", func);
9477d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return eRet;
9478d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9479d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if ((temp_bufferHdr - omx->m_out_mem_ptr) >= omx->drv_ctx.op_buf.actualcount) {
9480d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_ERROR("%s: Invalid header index %d",
9481d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan                func, (temp_bufferHdr - omx->m_out_mem_ptr));
9482d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return OMX_ErrorUndefined;
9483d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9484d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    unsigned int i = allocated_count;
9485d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    private_handle_t *handle = (private_handle_t *)buffer;
9486d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
9487d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    pmem_fd[i] = handle->fd;
9488d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    pmem_baseaddress[i] = (OMX_U8*)mmap(0, handle->size,
9489d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
9490d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    if (pmem_baseaddress[i] == MAP_FAILED) {
9491d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        DEBUG_PRINT_ERROR("%s: Failed to map native handle fd=%d size=%d",
9492d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan               func, handle->fd, handle->size);
9493d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan        return OMX_ErrorInsufficientResources;
9494d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    }
9495d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_heap_ptr[i].video_heap_ptr = NULL; //not used
9496d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_pmem_info_client[i].pmem_fd = handle->fd;
9497d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_pmem_info_client[i].offset = 0;
9498d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
9499d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
9500d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_platform_list_client[i].nEntries = 1;
9501d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
9502d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
9503d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].nAllocLen = handle->size;
9504d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].nFilledLen = 0;
9505d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].nFlags = 0;
9506d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
9507d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
9508d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
9509d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
9510d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
9511d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].pBuffer = buffer;
9512d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    m_out_mem_ptr_client[i].pAppPrivate = appData;
9513d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
9514d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    *bufferHdr = &m_out_mem_ptr_client[i];
9515d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    DEBUG_PRINT_LOW("%s: allocated header[%d]=%p for native handle[fd=%d size=%d]",
9516d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan            func, i, *bufferHdr, handle->fd, handle->size);
9517d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    allocated_count++;
9518d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan    return eRet;
9519d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan}
9520d3e4bca920af3d894529d2106b6645bc4a9b8268Praveen Chavan
952140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::is_component_secure()
952240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
952340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return secure_mode;
952440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
952540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
952640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
952740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
952840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
952940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled) {
953040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
953140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George     dest_color_format =  (OMX_COLOR_FORMATTYPE)
953240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
953340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
953440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      dest_color_format = OMX_COLOR_FormatYUV420SemiPlanar;
953540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else
953640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
953740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  } else {
95383072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan    if ((ColorFormat == OMX_COLOR_FormatYUV420Planar) ||
95393072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan       (ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
95403072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan        dest_color_format = ColorFormat;
95413072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan    } else {
95423072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan        status = false;
95433072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan    }
954440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
954540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
954640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
9547fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9548fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::secureDisplay(int mode) {
9549fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (m_secure_display == true) {
9550fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        return 0;
9551fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9552fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9553fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<IServiceManager> sm = defaultServiceManager();
9554fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<qService::IQService> displayBinder =
9555fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        interface_cast<qService::IQService>(sm->getService(String16("display.qservice")));
9556fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9557fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (displayBinder != NULL) {
9558fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        displayBinder->securing(mode);
9559fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        if (mode == qService::IQService::END) {
9560fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George            m_secure_display = true;
9561fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        }
9562fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9563fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    else {
9564fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_ERROR("secureDisplay(%d) display.qservice unavailable", mode);
9565fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9566fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    return 0;
9567fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George}
9568fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9569fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::unsecureDisplay(int mode) {
9570fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (m_secure_display == false) {
9571fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        return 0;
9572fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9573fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9574fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (mode == qService::IQService::END) {
9575fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        m_secure_display = false;
9576fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9577fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9578fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<IServiceManager> sm = defaultServiceManager();
9579fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<qService::IQService> displayBinder =
9580fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        interface_cast<qService::IQService>(sm->getService(String16("display.qservice")));
9581fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9582fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (displayBinder != NULL)
9583fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        displayBinder->unsecuring(mode);
9584fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    else
9585fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_ERROR("unsecureDisplay(%d) display.qservice unavailable", mode);
9586fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    return 0;
9587fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George}
958857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George
958957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::update_color_format(OMX_COLOR_FORMATTYPE eColorFormat)
959057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George{
959157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
959257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   OMX_ERRORTYPE eRet = OMX_ErrorNone;
959357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   enum vdec_output_fromat op_format;
95943072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan   if(eColorFormat ==
959557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka ||
95963072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan           eColorFormat == OMX_COLOR_FormatYUV420Planar ||
95973072d26ab7d74d4d832221395456eef9d84bb851Praveen Chavan           eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
959857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      op_format = VDEC_YUV_FORMAT_TILE_4x2;
959957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   else
960057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      eRet = OMX_ErrorBadParameter;
960157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George
960257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   if(eRet == OMX_ErrorNone && drv_ctx.output_format != op_format) {
960357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      /*Set the output format*/
960457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      drv_ctx.output_format = op_format;
960557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      ioctl_msg.in = &drv_ctx.output_format;
960657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      ioctl_msg.out = NULL;
960757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_OUTPUT_FORMAT,
960857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George              (void*)&ioctl_msg) < 0) {
960957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George        DEBUG_PRINT_ERROR("\n Set output format failed for %u with err %s",
961057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George                          eColorFormat, strerror(errno));
961157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George        eRet = OMX_ErrorUnsupportedSetting;
961257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      }
961357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      else
961457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George         eRet = get_buffer_req(&drv_ctx.op_buf);
961557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   }
961657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   if (eRet == OMX_ErrorNone){
961757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      if (!client_buffers.set_color_format(eColorFormat)) {
961857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          DEBUG_PRINT_ERROR("\n Set color format failed for %u", eColorFormat);
961957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          eRet = OMX_ErrorBadParameter;
962057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George       }
962157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George    }
962257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   if (!client_buffers.update_buffer_req()) {
962357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      DEBUG_PRINT_ERROR("\n Update bufreq in color format failed for %u", eColorFormat);
962457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      eRet = OMX_ErrorBadParameter;
962557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   }
962657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   return eRet;
962757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George}
9628