omx_vdec.cpp revision fcb1a02a7e154802e883bfdfde972e603f8a0a7c
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>
51e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h>
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
56e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h>
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if  defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h>
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_ICS_)
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <genlock.h>
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h"
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01
79e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
80e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv";
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata";
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
95e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_NUM_SPS 32
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_NUM_PPS 256
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR (MAX_NUM_SPS + MAX_NUM_PPS)
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SP_MP_START_CODE        0xC5000000
103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SP_MP_START_CODE_MASK   0xFF000000
104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_AP_SEQ_START_CODE       0x0F010000
105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_PROFILE_MASK   0xF0
106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE          0
108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_MAIN_PROFILE            1
109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_ADVANCE_PROFILE         3
110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_LEN            4
113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_POS            8
114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_A_POS            12
115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_B_POS            24
116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SEQ_LAYER_SIZE          36
117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    #define MEM_DEVICE "/dev/ion"
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_720P
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_adsp"
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P_EBI
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_adsp"
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_smipool"
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*
130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    extern "C"{
132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        #include<utils/Log.h>
133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif//_ANDROID_
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*/
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_LOW
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_HIGH
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_ERROR
140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_LOW ALOGV
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_HIGH ALOGV
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_ERROR ALOGE
144d31c34204bae71982ed9e5425cb110ebcb176f45Nick Pelly
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <glib.h>
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define strlcpy g_strlcpy
148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
152d31c34204bae71982ed9e5425cb110ebcb176f45Nick Pelly
153fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgebool omx_vdec::m_secure_display = false;
154fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* async_message_thread (void *input)
156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg;
158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_msginfo vdec_msg;
159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int error_code = 0;
161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (1)
164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = NULL;
166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = (void*)&vdec_msg;
167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Wait for a message from the video decoder driver*/
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error_code = ioctl ( omx->drv_ctx.video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,
169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         (void*)&ioctl_msg);
170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (error_code == -512) // ERESTARTSYS
171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (error_code < 0)
175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Error in ioctl read next msg");
177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }        /*Call Instance specific process function*/
179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (omx->async_message_process(input,&vdec_msg) < 0)
180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Wrong ioctl message");
182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return NULL;
186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* message_thread(void *input)
189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char id;
192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int n;
193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (1)
197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    n = read(omx->m_pipe_in, &id, 1);
200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(0 == n)
202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (1 == n)
207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omx->process_event_cb(omx, id);
209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ((n < 0) && (errno != EINTR))
211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return 0;
218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid post_message(omx_vdec *omx, unsigned char id)
221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      int ret_value;
223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      ret_value = write(omx->m_pipe_out, &id, 1);
225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx_cmd_queue destructor
229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_cmd_queue::~omx_cmd_queue()
230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  // Nothing to do
232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue constructor
235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue insert
241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool ret = true;
244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_q[m_write].id       = id;
247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_q[m_write].param1   = p1;
248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_q[m_write].param2   = p2;
249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_write++;
250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_size ++;
251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_write = 0;
254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ret = false;
259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue pop
265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool ret = true;
268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_size > 0)
269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *id = m_q[m_read].id;
271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *p1 = m_q[m_read].param1;
272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *p2 = m_q[m_read].param2;
273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Move the read pointer ahead
274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ++m_read;
275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    --m_size;
276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_read = 0;
279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ret = false;
284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Retrieve the first mesg type in the queue
289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return m_q[m_read].id;
292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //initialize timestamps array
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //free m_ts_arr_list?
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool duplicate_ts = false;
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //insert at the first available empty location
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_ts_arr_list[idx].valid)
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found invalid or empty entry, save timestamp
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].valid = true;
318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_ts_arr_list[idx].timestamp = ts;
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       ts, idx);
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int min_idx = -1;
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_TICKS min_ts = 0;
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_ts_arr_list[idx].valid)
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //found valid entry, save index
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (min_idx < 0)
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //first valid entry
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (m_ts_arr_list[idx].timestamp < min_ts)
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_ts = m_ts_arr_list[idx].timestamp;
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        min_idx = idx;
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (min_idx < 0)
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //no valid entries found
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = 0;
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = false;
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ts = m_ts_arr_list[min_idx].timestamp;
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[min_idx].valid = false;
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     ts, min_idx);
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool ret = true;
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int idx = 0;
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ts_arr_list[idx].valid = false;
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// factory function executed by the core to create instances
396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid *get_omx_component_factory_fn(void)
397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return (new omx_vdec);
399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     struct ion_handle *handle, int ionMapfd)
405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ion_device_fd = devicefd;
407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ion_handle = handle;
408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    MemoryHeapBase::init(ionMapfd, base, size, 0, MEM_DEVICE);
409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
412e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyVideoHeap::VideoHeap(int fd, size_t size, void* base)
413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // dup file descriptor, map once, use pmem
415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_
419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
420e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::omx_vdec
422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
423e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Constructor
425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
426e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None
428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
429e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_app_data(NULL),
434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_mem_ptr(NULL),
435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_mem_ptr(NULL),
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_phdr_pmem_ptr(NULL),
437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      pending_input_buffers(0),
438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      pending_output_buffers(0),
439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_bm_count(0),
440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_bm_count(0),
441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_bPopulated(OMX_FALSE),
442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_bPopulated(OMX_FALSE),
443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_flags(0),
444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_bEnabled(OMX_TRUE),
445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_out_bEnabled(OMX_TRUE),
446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_platform_list(NULL),
447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_platform_entry(NULL),
448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_pmem_info(NULL),
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      output_flush_progress (false),
450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      input_flush_progress (false),
451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      input_use_buffer (false),
452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      output_use_buffer (false),
453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      arbitrary_bytes (true),
454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      psource_frame (NULL),
455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      pdest_frame (NULL),
456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_inp_heap_ptr (NULL),
457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_heap_inp_bm_count (0),
458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      codec_type_parse ((codec_type)0),
459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_frame_meta (true),
460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      frame_count (0),
461090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly                      nal_length(0),
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      nal_count (0),
463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      look_ahead_nal (false),
464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_frame(0),
465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_buffer(NULL),
466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      first_frame_size (0),
467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_error_propogated(false),
468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      m_device_file_ptr(NULL),
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_vc1_profile((vc1_profile_type)0),
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      prev_ts(LLONG_MAX),
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      rst_prev_ts(true),
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      frm_int(0),
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_in_alloc_cnt(0),
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_display_id(NULL),
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      ouput_egl_buffers(false),
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_parser(NULL),
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      client_extradata(0),
478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_last_au_ts(LLONG_MAX),
479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      h264_last_au_flags(0),
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_inp_err_count(0),
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_heap_ptr(NULL),
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_heap_count(0),
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_enable_android_native_buffers(OMX_FALSE),
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_use_android_native_buffers(OMX_FALSE),
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      in_reconfig(false),
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_use_output_pmem(OMX_FALSE),
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_region_smi(OMX_FALSE),
490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_pvt_entry_pmem(OMX_FALSE),
491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      secure_mode(false)
492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,iDivXDrmDecrypt(NULL)
494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,m_desc_buffer_ptr(NULL)
496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    ,m_extradata(NULL)
497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* Assumption is that , to begin with , we have all the frames with decoder */
499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Constructor");
500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char property_value[PROPERTY_VALUE_MAX] = {0};
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.perf", property_value, "0");
503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  perf_flag = atoi(property_value);
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.start();
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    proc_frms = latency = 0;
509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_value[0] = NULL;
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.ts", property_value, "0");
512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_timestamp = atoi(property_value);
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.set_timestamp_reorder_mode(true);
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.enable_debug_print(true);
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_value[0] = NULL;
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.concealedmb", property_value, "0");
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_concealedmb = atoi(property_value);
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset(&m_cmp,0,sizeof(m_cmp));
527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset(&m_cb,0,sizeof(m_cb));
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset (&drv_ctx,0,sizeof(drv_ctx));
529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.timestamp_adjust = false;
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_driver_fd = -1;
539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_vendor_config.pData = NULL;
540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_init(&m_lock, NULL);
541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  sem_init(&m_cmd_lock,0,0);
542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char extradata_value[PROPERTY_VALUE_MAX] = {0};
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.extradata", extradata_value, "0");
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_debug_extradata = atoi(extradata_value);
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
54840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
54940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  client_buffers.set_vdec_client(this);
550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
554e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::~omx_vdec
556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
557e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Destructor
559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
560e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None
562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
563e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::~omx_vdec()
567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_pmem_info = NULL;
569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("In OMX vdec Destructor");
570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_pipe_in) close(m_pipe_in);
571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_pipe_out) close(m_pipe_out);
572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_pipe_in = -1;
573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_pipe_out = -1;
574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_join(msg_thread_id,NULL);
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_join(async_thread_id,NULL);
578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_destroy(&m_lock);
579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  sem_destroy(&m_cmd_lock);
580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dec_time.end();
585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
591e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::OMXCntrlProcessMsgCb
593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
594e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL Client callbacks are generated through this routine. The decoder
596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  provides the thread context for this routine.
597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
598e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  ctxt -- Context information related to the self.
600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  id   -- Event identifier. This could be any of the following:
601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          1. Command completion event
602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          2. Buffer done callback event
603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          3. Frame done callback event
604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
605e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned p1; // Parameter - 1
612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned p2; // Parameter - 2
613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned ident;
614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned qsize=0; // qsize
615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec *pThis = (omx_vdec *) ctxt;
616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(!pThis)
618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        __func__);
621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return;
622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  // Protect the shared queue data structure
625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  do
626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Read the message id's from the queue*/
628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&pThis->m_lock);
629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    qsize = pThis->m_cmd_q.m_size;
630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(qsize)
631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      qsize = pThis->m_ftb_q.m_size;
638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (qsize)
639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pThis->m_ftb_q.pop_entry(&p1,&p2,&ident);
641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (qsize == 0 && pThis->m_state != OMX_StatePause)
645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      qsize = pThis->m_etb_q.m_size;
647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (qsize)
648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pThis->m_etb_q.pop_entry(&p1,&p2,&ident);
650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&pThis->m_lock);
653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*process message if we have one*/
655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(qsize > 0)
656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      id = ident;
658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      switch (id)
659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EVENT:
661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            switch (p1)
664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_CommandStateSet:
666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = (OMX_STATETYPE) p2;
667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_state);
669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventCmdComplete, p1, p2, NULL);
671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_EventError:
674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                if(p2 == OMX_StateInvalid)
675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_state = (OMX_STATETYPE) p2;
678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                               OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                else if (p2 == OMX_ErrorHardware)
682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   pThis->omx_report_error();
684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                else
686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventError, p2, NULL, NULL );
689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_CommandPortDisable:
693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  break;
699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig)
701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->in_reconfig = false;
703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->drv_ctx.op_buf = pThis->op_buf_rcnfg;
704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  OMX_ERRORTYPE eRet = pThis->set_buffer_req(&pThis->drv_ctx.op_buf);
705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if(eRet !=  OMX_ErrorNone)
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pThis->omx_report_error();
709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      break;
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventCmdComplete, p1, p2, NULL );
714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              case OMX_CommandPortEnable:
716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_EventCmdComplete, p1, p2, NULL );
719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              default:
722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_EventCmdComplete, p1, p2, NULL );
724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_ETB:
742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         break;
749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_FTB:
751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             pThis->omx_report_error ();
756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_COMMAND:
760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    (OMX_U32)p2,(OMX_PTR)NULL);
762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EBD:
765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count++;
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ?true:false);
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->m_inp_err_count = 0;
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if ( pThis->empty_buffer_done(&pThis->m_cmp,
786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               pThis->omx_report_error ();
790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!pThis->arbitrary_bytes && pThis->m_inp_err_count > MAX_INPUT_ERROR)
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pThis->omx_report_error ();
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            int64_t *timestamp = (int64_t *)p1;
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (p1)
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->time_stamp_dts.remove_time_stamp(*timestamp,
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ?true:false);
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free(timestamp);
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_FBD:
811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (p2 != VDEC_S_SUCCESS)
812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pThis->omx_report_error ();
815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( pThis->fill_buffer_done(&pThis->m_cmp,
817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->omx_report_error ();
821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->input_flush_progress)
827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_input_flush();
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_INPUT_FLUSH_PENDING))
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_INPUT_PORT_INDEX,NULL );
851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags,
853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_COMPONENT_IDLE_PENDING))
854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->output_flush_progress)
856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     if (ioctl (pThis->drv_ctx.video_driver_fd,
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                VDEC_IOCTL_CMD_STOP,NULL ) < 0)
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     {
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       pThis->omx_report_error ();
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     }
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!pThis->output_flush_progress)
878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->execute_output_flush();
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->m_cb.EventHandler)
885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (p2 != VDEC_S_SUCCESS)
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->omx_report_error ();
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                /*Check if we need generate event for Flush done*/
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Notify Output Flush done");
898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_EventCmdComplete,OMX_CommandFlush,
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                           OMX_CORE_OUTPUT_PORT_INDEX,NULL );
902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(BITMASK_PRESENT(&pThis->m_flags,
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_LOW("\n Internal flush complete");
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  BITMASK_CLEAR (&pThis->m_flags,
908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (BITMASK_PRESENT(&pThis->m_flags,
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pThis->post_event(OMX_CommandPortDisable,
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_CORE_OUTPUT_PORT_INDEX,
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_COMPONENT_GENERATE_EVENT);
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    BITMASK_CLEAR (&pThis->m_flags,
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (!pThis->input_flush_progress)
924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    if (ioctl (pThis->drv_ctx.video_driver_fd,
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               VDEC_IOCTL_CMD_STOP,NULL ) < 0)
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    {
929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      pThis->omx_report_error ();
931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    }
932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_START_DONE:
944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n Move to executing");
959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StateExecuting;
962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_EventCmdComplete,OMX_CommandStateSet,
964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_StateExecuting, NULL);
965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else if (BITMASK_PRESENT(&pThis->m_flags,
967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_COMPONENT_PAUSE_PENDING))
968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (ioctl (pThis->drv_ctx.video_driver_fd,
970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           VDEC_IOCTL_CMD_PAUSE,NULL ) < 0)
971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                {
972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  pThis->omx_report_error ();
974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                }
975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_PAUSE_DONE:
985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                //Send the callback now
1000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
1001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StatePause;
1002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_StatePause, NULL);
1005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
1006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_RESUME_DONE:
1016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
1017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
1018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
1019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
1020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
1022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
1023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
1025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
1027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
1028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
1029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
1030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
1031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StateExecuting;
1032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_EventCmdComplete,OMX_CommandStateSet,
1034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_StateExecuting,NULL);
1035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
1036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
1038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_STOP_DONE:
1046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
1047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if (pThis->m_cb.EventHandler)
1048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
1049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (p2 != VDEC_S_SUCCESS)
1050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
1052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pThis->omx_report_error ();
1053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
1055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->complete_pending_buffer_done_cbs();
1057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
1058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
1059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
1060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
1061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
1062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_state = OMX_StateIdle;
1063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("\n Move to Idle State");
1064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
1065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_EventCmdComplete,OMX_CommandStateSet,
1066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_StateIdle,NULL);
1067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
1068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
1069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
1070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
1079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->start_port_reconfig() != OMX_ErrorNone)
1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pThis->omx_report_error();
1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->in_reconfig)
1084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->m_cb.EventHandler) {
1086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
1096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  format = OMX_InterlaceInterleaveFrameTopFieldFirst;
1098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else //unsupported interlace format; raise a error
1101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  event = OMX_EventError;
1102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pThis->m_cb.EventHandler) {
1103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    event, format, 0, NULL );
1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_EOS_DONE:
1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler) {
1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->prev_ts = LLONG_MAX;
1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pThis->rst_prev_ts = true;
1122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
1125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
1126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pThis->omx_report_error ();
1127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pThis->m_cb.EventHandler) {
1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        default:
1139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
1140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&pThis->m_lock);
1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    qsize = pThis->m_cmd_q.m_size;
1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pThis->m_state != OMX_StatePause)
1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
1146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&pThis->m_lock);
1147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while(qsize>0);
1149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1155e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentInit
1157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1158e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Initialize the component.
1160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1161e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  ctxt -- Context information related to the self.
1163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  id   -- Event identifier. This could be any of the following:
1164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          1. Command completion event
1165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          2. Buffer done callback event
1166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          3. Frame done callback event
1167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1168e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
1170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1172e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
1176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
1177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int   alignment = 0,buffer_size = 0;
1178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int fds[2];
1179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int r;
1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STRING device_name = "/dev/msm_vidc_dec";
1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
1183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      secure_mode = true;
1184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      arbitrary_bytes = false;
1185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      role = "OMX.qcom.video.decoder.avc";
1186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      device_name =  "/dev/msm_vidc_dec_sec";
1187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1188fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1189fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  if (secure_mode) {
1190fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secureDisplay(qService::IQService::START) < 0) {
1191fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      DEBUG_PRINT_HIGH("Sending message to start securing display failed");
1192fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
1193fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  }
1194fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Start of New Playback : role  = %s : DEVICE = %s",
1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        role, device_name);
1197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
1199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.video_driver_fd, errno);
1202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.video_driver_fd == 0){
1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
1205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.video_driver_fd < 0)
1208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
1210fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      eRet = OMX_ErrorInsufficientResources;
1211fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      goto cleanup;
1212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  drv_ctx.frame_rate.fps_denominator = 1;
1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  outputBufferFile1 = fopen (outputfilename, "ab");
1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
1224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  outputExtradataFile = fopen (ouputextradatafilename, "ab");
1225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
1226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  // Copy the role information which provides the decoder kind
1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  strlcpy(drv_ctx.kind,role,128);
1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
1230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_MAX_STRINGNAME_SIZE))
1231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
1233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     OMX_MAX_STRINGNAME_SIZE);
1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.timestamp_adjust = true;
1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
1236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     /*Initialize Start Code for MPEG4*/
1238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     codec_type_parse = CODEC_TYPE_MPEG4;
1239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     m_frame_parser.init_start_codes (codec_type_parse);
1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "m4v");
1242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
1245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_MAX_STRINGNAME_SIZE))
1246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_MAX_STRINGNAME_SIZE);
1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
1250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingMPEG2;
1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Initialize Start Code for MPEG2*/
1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_MPEG2;
1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "mpg");
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
1259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         OMX_MAX_STRINGNAME_SIZE))
1260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
1262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_LOW("\n H263 Decoder selected");
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
1264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     eCompressionFormat = OMX_VIDEO_CodingH263;
1265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     codec_type_parse = CODEC_TYPE_H263;
1266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     m_frame_parser.init_start_codes (codec_type_parse);
1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "263");
1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
1273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         OMX_MAX_STRINGNAME_SIZE))
1274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1285fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1286fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
1291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         OMX_MAX_STRINGNAME_SIZE))
1292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1303fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1304fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1321fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1322fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, \
1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)))
1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR ("\n DIVX Decoder selected");
1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_5;
1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     codec_type_parse = CODEC_TYPE_DIVX;
1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_frame_parser.init_start_codes (codec_type_parse);
1337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = createDivxDrmContext();
1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if( err != OMX_ErrorNone ) {
1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
1342fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         eRet = err;
1343fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George         goto cleanup;
1344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingAVC;
1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_H264;
1355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_nal_length(nal_length);
1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "264");
1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingWMV;
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_VC1;
1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "vc1");
1371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_MAX_STRINGNAME_SIZE))
1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eCompressionFormat = OMX_VIDEO_CodingWMV;
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_type_parse = CODEC_TYPE_VC1;
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.init_start_codes (codec_type_parse);
1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(inputfilename, "vc1");
1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInvalidComponentName;
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  inputBufferFile1 = fopen (inputfilename, "ab");
1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (eRet == OMX_ErrorNone)
1394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
1397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
140140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
140240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
140340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.set_color_format(dest_color_format)) {
140440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Setting color format failed");
140540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      eRet = OMX_ErrorInsufficientResources;
140640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Initialize Decoder with codec type and resolution*/
1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.decoder_format;
1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
1411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ( (eRet == OMX_ErrorNone) &&
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_CODEC,
1414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (void*)&ioctl_msg) < 0)
1415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set codec type failed");
1418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Set the output format*/
1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.output_format;
1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
1424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ( (eRet == OMX_ErrorNone) &&
1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
1427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           (void*)&ioctl_msg) < 0)
1428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set output format failed");
1430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef MAX_RES_720P
1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_resolution.frame_height =
1435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.video_resolution.scan_lines = 720;
1436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_resolution.frame_width =
1437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.video_resolution.stride = 1280;
1438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
1439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef MAX_RES_1080P
1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_resolution.frame_height =
1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.video_resolution.scan_lines = 1088;
1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_resolution.frame_width =
1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.video_resolution.stride = 1920;
1444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
1445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.video_resolution;
1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
1448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ( (eRet == OMX_ErrorNone) &&
1450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_PICRES,
1451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           (void*)&ioctl_msg) < 0)
1452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set Resolution failed");
1454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Get the Buffer requirements for input and output ports*/
1458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.extradata = 0;
1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
1463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.idr_only_decoding = 0;
1464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (eRet == OMX_ErrorNone)
1466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = get_buffer_req(&drv_ctx.ip_buf);
1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (eRet == OMX_ErrorNone)
1468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = get_buffer_req(&drv_ctx.op_buf);
1469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_state = OMX_StateLoaded;
1470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
1471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (eRet == OMX_ErrorNone && !secure_mode)
1472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = enable_extradata(DEFAULT_EXTRADATA);
1473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( (codec_type_parse == CODEC_TYPE_VC1) ||
1475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (codec_type_parse == CODEC_TYPE_H264)) //add CP check here
1476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //Check if dmx can be disabled
1478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
1479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_ERRORTYPE eRet = OMX_ErrorNone;
1480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ioctl_msg.out = &drv_ctx.disable_dmx;
1481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT, &ioctl_msg))
1482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT");
1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorHardware;
1485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.disable_dmx && !secure_mode)
1489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("DMX disable is supported");
1491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          int rc = ioctl(drv_ctx.video_driver_fd,
1493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      VDEC_IOCTL_SET_DISABLE_DMX);
1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(rc < 0) {
1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Failed to disable dmx on driver.");
1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.disable_dmx = false;
1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorHardware;
1498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.disable_dmx = false;
1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
1506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_frame_parser.mutils == NULL)
1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils = new H264_Utils();
1510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_frame_parser.mutils == NULL)
1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet = OMX_ErrorInsufficientResources;
1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nFilledLen = 0;
1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         h264_scratch.nOffset = 0;
1522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (h264_scratch.pBuffer == NULL)
1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           return OMX_ErrorInsufficientResources;
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_frame_parser.mutils->initialize_frame_checking_environment();
1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_parser = new h264_stream_parser();
1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!h264_parser)
1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorInsufficientResources;
1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(pipe(fds))
1542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("pipe creation failed\n");
1544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInsufficientResources;
1545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      int temp1[2];
1549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(fds[0] == 0 || fds[1] == 0)
1550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (pipe (temp1))
1552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("pipe creation failed\n");
1554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorInsufficientResources;
1555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //close (fds[0]);
1557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //close (fds[1]);
1558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        fds[0] = temp1 [0];
1559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        fds[1] = temp1 [1];
1560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_pipe_in = fds[0];
1562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_pipe_out = fds[1];
1563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      r = pthread_create(&msg_thread_id,0,message_thread,this);
1564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(r < 0)
1566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
1568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInsufficientResources;
1569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
1571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        r = pthread_create(&async_thread_id,0,async_message_thread,this);
1573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(r < 0)
1574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\n component_init(): async_message_thread creation failed");
1576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorInsufficientResources;
1577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (eRet != OMX_ErrorNone)
1583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Component Init Failed");
1585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
1587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        NULL);
1588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close (drv_ctx.video_driver_fd);
1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.video_driver_fd = -1;
1591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
1593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
1595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
1598fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1599fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgecleanup:
1600fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1601fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  if (secure_mode && (eRet == OMX_ErrorNone)) {
1602fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secureDisplay(qService::IQService::END) < 0) {
1603fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      DEBUG_PRINT_HIGH("sending message to stop securing display failed");
1604fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
1605fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George  }
1606fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
1607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
1608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1611e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetComponentVersion
1613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1614e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns the component version.
1616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1617e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  TBD.
1619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1620e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ErrorNone.
1622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1624e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_component_version
1625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     (
1626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_HANDLETYPE hComp,
1627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_STRING componentName,
1628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_VERSIONTYPE* componentVersion,
1629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_VERSIONTYPE* specVersion,
1630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_OUT OMX_UUIDTYPE* componentUUID
1631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      )
1632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
1634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
1636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
1637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* TBD -- Return the proper version */
1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (specVersion)
1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    specVersion->nVersion = OMX_SPEC_VERSION;
1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
1644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1646e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SendCommand
1648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1649e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns zero if all the buffers released..
1651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1652e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
1654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1655e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
1657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1659e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
1660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_COMMANDTYPE cmd,
1661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_U32 param1,
1662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_PTR cmdData
1663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      )
1664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
1666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
1667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
1669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
1670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "to invalid port: %d", param1);
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadPortIndex;
1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_wait(&m_cmd_lock);
1680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n send_command: Command Processed\n");
1681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
1682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
1685e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
1686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SendCommand
1687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1688e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
1689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns zero if all the buffers released..
1690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1691e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
1692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
1693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1694e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
1695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
1696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
1698e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
1699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_IN OMX_COMMANDTYPE cmd,
1700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_IN OMX_U32 param1,
1701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_IN OMX_PTR cmdData
1702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            )
1703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
1705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_STATETYPE eState = (OMX_STATETYPE) param1;
1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int bFlag = 1,sem_posted = 0;
1707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
1709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
1710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_state, eState);
1711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(cmd == OMX_CommandStateSet)
1713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
1715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
1716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is Loaded */
1718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateLoaded)
1720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateIdle)
1722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //if all buffers are allocated or all ports disabled
1724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(allocate_done() ||
1725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
1726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
1728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
1730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
1732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
1733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          // Skip the event notification
1734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
1735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Loaded */
1738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateLoaded)
1739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
1741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,\
1742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
1744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to WaitForResources */
1746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateWaitForResources)
1747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Since error is None , we will post an event
1749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           at the end of this function definition */
1750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
1751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Executing */
1753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateExecuting)
1754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
1756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
1759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Pause */
1761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StatePause)
1762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
1764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
1767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Loaded to Invalid */
1769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateInvalid)
1770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
1772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
1774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
1776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
1778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          eState);
1779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadParameter;
1780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is IDLE */
1785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateIdle)
1787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateLoaded)
1789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(release_done())
1791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          /*
1793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             Since error is None , we will post an event at the end
1794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             of this function definition
1795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          */
1796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
1797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
1799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
1801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
1802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          // Skip the event notification
1803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
1804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to Executing */
1807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateExecuting)
1808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
1811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bFlag = 0;
1812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
1813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    NULL) < 0)
1814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
1816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
1817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorHardware;
1818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to Idle */
1821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateIdle)
1822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
1824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,\
1825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
1827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to WaitForResources */
1829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateWaitForResources)
1830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
1832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
1835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Idle to Pause */
1837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StatePause)
1838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         /*To pause the Video core we need to start the driver*/
1840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
1841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    NULL) < 0)
1842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
1844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           omx_report_error ();
1845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           eRet = OMX_ErrorHardware;
1846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         else
1848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
1851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           bFlag = 0;
1852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Idle to Invalid */
1855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateInvalid)
1856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
1858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
1860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
1862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
1864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadParameter;
1865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /******************************/
1869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is Executing */
1870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /******************************/
1871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateExecuting)
1872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
1874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Idle */
1875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       if(eState == OMX_StateIdle)
1876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         /* Since error is None , we will post an event
1878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         at the end of this function definition
1879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         */
1880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
1881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
1882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         if(!sem_posted)
1883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_posted = 1;
1885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_post (&m_cmd_lock);
1886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           execute_omx_flush(OMX_ALL);
1887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         bFlag = 0;
1889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Paused */
1891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StatePause)
1892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_LOW("\n PAUSE Command Issued");
1894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
1895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    NULL) < 0)
1896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_ERROR("\n Error In Pause State");
1898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           post_event(OMX_EventError,OMX_ErrorHardware,\
1899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      OMX_COMPONENT_GENERATE_EVENT);
1900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           eRet = OMX_ErrorHardware;
1901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         else
1903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n");
1906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           bFlag = 0;
1907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Loaded */
1910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateLoaded)
1911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
1913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_COMPONENT_GENERATE_EVENT);
1915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorIncorrectStateTransition;
1916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to WaitForResources */
1918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateWaitForResources)
1919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
1921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_COMPONENT_GENERATE_EVENT);
1923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorIncorrectStateTransition;
1924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Executing */
1926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateExecuting)
1927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
1929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,OMX_ErrorSameState,\
1930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_COMPONENT_GENERATE_EVENT);
1931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorSameState;
1932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Executing to Invalid */
1934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else if(eState == OMX_StateInvalid)
1935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
1937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
1938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorInvalidState;
1939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       else
1941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
1942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
1943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         eRet = OMX_ErrorBadParameter;
1944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
1945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is Pause  */
1948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
1949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StatePause)
1950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to Executing */
1952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateExecuting)
1953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Pause --> Executing \n");
1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
1956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   NULL) < 0)
1957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
1959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          post_event(OMX_EventError,OMX_ErrorHardware,\
1960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT);
1961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorHardware;
1962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
1964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
1966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          post_event (NULL,VDEC_S_SUCCESS,\
1968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      OMX_COMPONENT_GENERATE_RESUME_DONE);
1969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
1970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to Idle */
1973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateIdle)
1974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Since error is None , we will post an event
1976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        at the end of this function definition */
1977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Pause --> Idle \n");
1978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
1979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         if(!sem_posted)
1980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
1981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_posted = 1;
1982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           sem_post (&m_cmd_lock);
1983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           execute_omx_flush(OMX_ALL);
1984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
1985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         bFlag = 0;
1986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to loaded */
1988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateLoaded)
1989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
1991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
1992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
1993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
1994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to WaitForResources */
1996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateWaitForResources)
1997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
1999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
2002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from Pause to Pause */
2004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StatePause)
2005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
2007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,\
2008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
2010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       /* Requesting transition from Pause to Invalid */
2012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateInvalid)
2013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
2015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
2017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
2021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadParameter;
2022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     /***************************/
2025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Current State is WaitForResources  */
2026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /***************************/
2027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateWaitForResources)
2028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Loaded */
2030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(eState == OMX_StateLoaded)
2031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Since error is None , we will post an event
2033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        at the end of this function definition */
2034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
2035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to WaitForResources */
2037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (eState == OMX_StateWaitForResources)
2038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
2040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorSameState,
2041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorSameState;
2043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Executing */
2045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateExecuting)
2046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
2048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
2051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Pause */
2053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StatePause)
2054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
2056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
2057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
2058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorIncorrectStateTransition;
2059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Invalid */
2061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(eState == OMX_StateInvalid)
2062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
2064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
2065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorInvalidState;
2066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* Requesting transition from WaitForResources to Loaded -
2068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      is NOT tested by Khronos TS */
2069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
2074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadParameter;
2075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /********************************/
2078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* Current State is Invalid */
2079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*******************************/
2080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if(m_state == OMX_StateInvalid)
2081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* State Transition from Inavlid to any state */
2083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
2084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  || OMX_StateIdle || OMX_StateExecuting
2085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  || OMX_StatePause || OMX_StateInvalid))
2086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
2088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      post_event(OMX_EventError,OMX_ErrorInvalidState,\
2089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 OMX_COMPONENT_GENERATE_EVENT);
2090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorInvalidState;
2091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if (cmd == OMX_CommandFlush)
2094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
2096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        "with param1: %d", param1);
2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
2100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
2102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
2104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!sem_posted){
2106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      sem_posted = 1;
2107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Set the Semaphore");
2108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      sem_post (&m_cmd_lock);
2109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      execute_omx_flush(param1);
2110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bFlag = 0;
2112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if ( cmd == OMX_CommandPortEnable)
2114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
2116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        "with param1: %d", param1);
2117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_inp_bEnabled = OMX_TRUE;
2120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if( (m_state == OMX_StateLoaded &&
2122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            || allocate_input_done())
2124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
2126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT);
2127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
2129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
2132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          // Skip the event notification
2133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          bFlag = 0;
2134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("\n Enable output Port command recieved");
2139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          m_out_bEnabled = OMX_TRUE;
2140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if( (m_state == OMX_StateLoaded &&
2142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
2143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              || (allocate_output_done()))
2144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
2147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
2150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
2152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
2153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              // Skip the event notification
2154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              bFlag = 0;
2155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if (cmd == OMX_CommandPortDisable)
2159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
2161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          "with param1: %d", param1);
2162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
2163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          m_inp_bEnabled = OMX_FALSE;
2165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              && release_input_done())
2167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
2170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
2172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
2174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             {
2176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               if(!sem_posted)
2177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               {
2178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 sem_posted = 1;
2179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 sem_post (&m_cmd_lock);
2180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               }
2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
2182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             }
2183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             // Skip the event notification
2185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             bFlag = 0;
2186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
2189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          m_out_bEnabled = OMX_FALSE;
2191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("\n Disable output Port command recieved");
2192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
2193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              && release_output_done())
2194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
2197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
2199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
2200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
2201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
2202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (!sem_posted)
2204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
2205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                sem_posted = 1;
2206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                sem_post (&m_cmd_lock);
2207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
2210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
2211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Skip the event notification
2212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            bFlag = 0;
2213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         }
2215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
2218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
2220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorNotImplemented;
2221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(eRet == OMX_ErrorNone && bFlag)
2223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
2225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(!sem_posted)
2227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_post(&m_cmd_lock);
2229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
2232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
2235e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ExecuteOmxFlush
2237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2238e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Executes the OMX flush.
2240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2241e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  flushtype - input flush(1)/output flush(0)/ both.
2243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2244e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  enum vdec_bufferflush flush_dir;
2252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (flushType)
2254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_INPUT_PORT_INDEX:
2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_INPUT;
2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_CORE_OUTPUT_PORT_INDEX:
2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
2262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      input_flush_progress = true;
2265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      output_flush_progress = true;
2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      flush_dir = VDEC_FLUSH_TYPE_ALL;
2267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &flush_dir;
2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < 0)
2271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
2273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bRet = false;
2274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*=========================================================================
2278e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION : execute_output_flush
2279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2280e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Executes the OMX flush at OUTPUT PORT.
2282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2283e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
2285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2286e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly==========================================================================*/
2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p1 = 0; // Parameter - 1
2292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p2 = 0; // Parameter - 2
2293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      ident = 0;
2294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = true;
2295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Generate FBD for all Buffers in the FTBq*/
2297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_lock(&m_lock);
2298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Initiate Output Flush");
2299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (m_ftb_q.m_size)
2300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
2302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       m_ftb_q.m_size,pending_output_buffers);
2303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.pop_entry(&p1,&p2,&ident);
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
230540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if(ident == m_fill_output_msg)
2306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pending_output_buffers++;
230840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (ident == OMX_COMPONENT_GENERATE_FBD)
2311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_unlock(&m_lock);
2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_flush_progress = false;
2317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes)
2319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
2324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*=========================================================================
2327e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION : execute_input_flush
2328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2329e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Executes the OMX flush at INPUT PORT.
2331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2332e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
2334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2335e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly==========================================================================*/
2338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned       i =0;
2341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p1 = 0; // Parameter - 1
2342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      p2 = 0; // Parameter - 2
2343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned      ident = 0;
2344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = true;
2345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Generate EBD for all Buffers in the ETBq*/
2347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
2348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_lock(&m_lock);
2350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
2351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  while (m_etb_q.m_size)
2352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.pop_entry(&p1,&p2,&ident);
2354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
2358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
2359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
236040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else if(ident == m_fill_output_msg)
2361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pending_input_buffers++;
2363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
2364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
2365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
2366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (ident == OMX_COMPONENT_GENERATE_EBD)
2368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
2370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_BUFFERHEADERTYPE *)p1);
2371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
2372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  time_stamp_dts.flush_timestamp();
2375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Check if Heap Buffers are to be flushed*/
2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (arbitrary_bytes && !(codec_config_flag))
2377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
2379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    h264_scratch.nFilledLen = 0;
2380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nal_count = 0;
2381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    look_ahead_nal = false;
2382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    frame_count = 0;
2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
2387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Initialize parser");
2388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_frame_parser.mutils)
2389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_frame_parser.mutils->initialize_frame_checking_environment();
2391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    while (m_input_pending_q.m_size)
2394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_input_pending_q.pop_entry(&p1,&p2,&ident);
2396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
2397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame)
2400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
2402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
2403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame)
2406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen = 0;
2408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
2409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame = NULL;
2410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_frame_parser.flush();
2412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (codec_config_flag)
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       "is not sent to the driver yet");
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_unlock(&m_lock);
2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  input_flush_progress = false;
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes)
2421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = LLONG_MAX;
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
2424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_timestamp_list.reset_ts_list();
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
2432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
2437e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SendCommandEvent
2439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2440e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Send the event to decoder pipe.  This is needed to generate the callbacks
2442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  in decoder thread context.
2443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2444e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
2446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2447e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
2449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::post_event(unsigned int p1,
2452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          unsigned int p2,
2453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          unsigned int id)
2454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet      =                      false;
2456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_lock(&m_lock);
2459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
246040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (id == m_fill_output_msg ||
2461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      id == OMX_COMPONENT_GENERATE_FBD)
2462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.insert_entry(p1,p2,id);
2464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (id == OMX_COMPONENT_GENERATE_ETB ||
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_EBD ||
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
2468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.insert_entry(p1,p2,id);
2470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
2472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.insert_entry(p1,p2,id);
2474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
2475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet = true;
2477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
2478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  post_message(this, id);
2479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_unlock(&m_lock);
2481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
2483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
2488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!profileLevelType)
2489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(profileLevelType->nPortIndex == 0) {
2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (profileLevelType->nProfileIndex == 1)
2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 2)
2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel31;
2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            profileLevelType->nProfileIndex);
2514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
2517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!profileLevelType)
2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(profileLevelType->nPortIndex == 0) {
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (profileLevelType->nProfileIndex == 1)
2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 2)
2578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            profileLevelType->nProfileIndex);
2586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (profileLevelType->nProfileIndex == 0)
2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(profileLevelType->nProfileIndex == 1)
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNoMore;
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
2649e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetParameter
2651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2652e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Get Parameter method implementation
2654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2655e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
2657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2658e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Error None if successful.
2660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2662e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_INDEXTYPE paramIndex,
2664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_INOUT OMX_PTR     paramData)
2665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("get_parameter: \n");
2669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
2670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
2672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
2673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(paramData == NULL)
2675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
2677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorBadParameter;
2678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch(paramIndex)
2680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
2681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPortDefinition:
2682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
2685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = update_portdef(portDefn);
2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eRet == OMX_ErrorNone)
2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_port_def = *portDefn;
2689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
2690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoInit:
2692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_PORT_PARAM_TYPE *portParamType =
2694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              (OMX_PORT_PARAM_TYPE *) paramData;
2695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
2696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nSize = sizeof(portParamType);
2699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nPorts           = 2;
2700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portParamType->nStartPortNumber = 0;
2701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
2702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoPortFormat:
2704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
2706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
2707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
2708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
2710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt->nSize             = sizeof(portFmt);
2711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (0 == portFmt->nPortIndex)
2713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (0 == portFmt->nIndex)
2715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
2717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              portFmt->eCompressionFormat = eCompressionFormat;
2718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
2720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
2722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              " NoMore compression formats\n");
2723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet =  OMX_ErrorNoMore;
2724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (1 == portFmt->nPortIndex)
2727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
2730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (0 == portFmt->nIndex)
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if(1 == portFmt->nIndex)
2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(0 == portFmt->nIndex)
2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
274140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        else if (1 == portFmt->nIndex) {
274240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
274340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        }
2744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
2745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
2747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  " NoMore Color formats\n");
2748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           eRet =  OMX_ErrorNoMore;
2749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
2754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          (int)portFmt->nPortIndex);
2755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
2756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
2758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Component should support this port definition*/
2760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamAudioInit:
2761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_PORT_PARAM_TYPE *audioPortParamType =
2763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                              (OMX_PORT_PARAM_TYPE *) paramData;
2764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
2765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nSize = sizeof(audioPortParamType);
2767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nPorts           = 0;
2768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        audioPortParamType->nStartPortNumber = 0;
2769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Component should support this port definition*/
2772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamImageInit:
2773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_PORT_PARAM_TYPE *imagePortParamType =
2775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                              (OMX_PORT_PARAM_TYPE *) paramData;
2776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
2777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
2778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nSize = sizeof(imagePortParamType);
2779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nPorts           = 0;
2780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        imagePortParamType->nStartPortNumber = 0;
2781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Component should support this port definition*/
2785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamOtherInit:
2786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
2788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          paramIndex);
2789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet =OMX_ErrorUnsupportedIndex;
2790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamStandardComponentRole:
2793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_PARAM_COMPONENTROLETYPE *comp_role;
2795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
2796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
2797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        comp_role->nSize = sizeof(*comp_role);
2798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
2800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
2802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OMX_MAX_STRINGNAME_SIZE);
2803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Added for parameter test */
2806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPriorityMgmt:
2807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            OMX_PRIORITYMGMTTYPE *priorityMgmType =
2810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                             (OMX_PRIORITYMGMTTYPE *) paramData;
2811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
2812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
2813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            priorityMgmType->nSize = sizeof(priorityMgmType);
2814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Added for parameter test */
2818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamCompBufferSupplier:
2819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
2821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
2822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
2823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            bufferSupplierType->nSize = sizeof(bufferSupplierType);
2825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
2826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(0 == bufferSupplierType->nPortIndex)
2827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if (1 == bufferSupplierType->nPortIndex)
2829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
2830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
2831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                eRet = OMX_ErrorBadPortIndex;
2832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoAvc:
2837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
2839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        paramIndex);
2840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoH263:
2843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
2845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        paramIndex);
2846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoMpeg4:
2849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
2851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        paramIndex);
2852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
2853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoMpeg2:
2855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              paramIndex);
2858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_IndexParamVideoProfileLevelQuerySupported:
2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
2863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
2864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = get_supported_profile_level_for_720p(profileLevelType);
2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
2869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = get_supported_profile_level_for_1080p(profileLevelType);
2870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
2875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
2880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(secure_mode) {
2881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                      GRALLOC_USAGE_PRIVATE_CP_BUFFER | GRALLOC_USAGE_PRIVATE_UNCACHED);
2883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                } else {
2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP |
2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                         GRALLOC_USAGE_PRIVATE_IOMMU_HEAP);
2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (MAX_RES_720P) ||  defined (MAX_RES_1080P_EBI)
2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P
2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else {
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorBadParameter;
2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =OMX_ErrorUnsupportedIndex;
2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_width,
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_height,
2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.stride,
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.scan_lines);
2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((params == NULL) ||
2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer == NULL) ||
2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer->handle == NULL) ||
2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      !m_enable_android_native_buffers)
2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
29343d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
29353d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George    if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
29363d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
29373d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                          " expected %u, got %lu",
29383d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                          drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
29393d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        return OMX_ErrorBadParameter;
29403d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George    }
29413d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer = (OMX_U8*)mmap(0, handle->size,
2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(buffer == MAP_FAILED) {
2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    return OMX_ErrorInsufficientResources;
2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2960e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::Setparameter
2962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2963e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Set Parameter method implementation.
2965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2966e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
2968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2969e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
2971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2973e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_INDEXTYPE paramIndex,
2975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_PTR        paramData)
2976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
2979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
2981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
2983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
2984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(paramData == NULL)
2986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
2988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         return OMX_ErrorBadParameter;
2989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((m_state != OMX_StateLoaded) &&
2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_out_bEnabled == OMX_TRUE) &&
2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_inp_bEnabled == OMX_TRUE)) {
2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch(paramIndex)
3000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPortDefinition:
3002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
3004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //been called.
3007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
3008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             (int)portDefn->format.video.nFrameHeight,
3009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             (int)portDefn->format.video.nFrameWidth);
3010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(OMX_DirOutput == portDefn->eDir)
3011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
3013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_display_id = portDefn->format.video.pNativeWindow;
301440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          unsigned int buffer_size;
301540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          if (!client_buffers.get_buffer_req(buffer_size)) {
301640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
301740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            eRet = OMX_ErrorBadParameter;
301840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          } else {
301940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
302040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                 portDefn->nBufferSize >=  buffer_size)
302140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George              {
302240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
302340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
302440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                eRet = set_buffer_req(&drv_ctx.op_buf);
302540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                if (eRet == OMX_ErrorNone)
302640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                    m_port_def = *portDefn;
302740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            }
302840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            else
3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
303040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                DEBUG_PRINT_HIGH("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
303140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
303240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  portDefn->nBufferCountActual, portDefn->nBufferSize);
303340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                eRet = OMX_ErrorBadParameter;
303440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            }
3035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(OMX_DirInput == portDefn->eDir)
3038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((portDefn->format.video.xFramerate >> 16) > 0 &&
3040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
3041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Frame rate only should be set if this is a "known value" or to
3043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // activate ts prediction logic (arbitrary mode only) sending input
3044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // timestamps with max value (LLONG_MAX).
3045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %d",
3046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             portDefn->format.video.xFramerate >> 16);
3047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
3048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          drv_ctx.frame_rate.fps_denominator);
3049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!drv_ctx.frame_rate.fps_numerator)
3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
3052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = 30;
3053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(drv_ctx.frame_rate.fps_denominator)
3055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = (int)
3056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
3057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_denominator = 1;
3058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
3059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      drv_ctx.frame_rate.fps_numerator;
3060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            ioctl_msg.in = &drv_ctx.frame_rate;
3061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
3062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       (void*)&ioctl_msg) < 0)
3063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
3065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
3067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             frm_int, drv_ctx.frame_rate.fps_numerator /
3068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (float)drv_ctx.frame_rate.fps_denominator);
3069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
3071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(drv_ctx.video_resolution.frame_height !=
3072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameHeight ||
3073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.video_resolution.frame_width  !=
3074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameWidth)
3075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
3076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
3077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameWidth,
3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameHeight);
3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if (portDefn->format.video.nFrameHeight != 0x0 &&
3080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 portDefn->format.video.nFrameWidth != 0x0)
3081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             {
3082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.video_resolution.frame_height =
3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 drv_ctx.video_resolution.scan_lines =
3084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 portDefn->format.video.nFrameHeight;
3085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.video_resolution.frame_width =
3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 drv_ctx.video_resolution.stride =
3087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 portDefn->format.video.nFrameWidth;
3088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ioctl_msg.in = &drv_ctx.video_resolution;
3089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ioctl_msg.out = NULL;
3090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
3091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (void*)&ioctl_msg) < 0)
3092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               {
3093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   DEBUG_PRINT_ERROR("\n Set Resolution failed");
3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = OMX_ErrorUnsupportedSetting;
3095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               }
3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               else
3097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = get_buffer_req(&drv_ctx.op_buf);
3098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = set_buffer_req(&drv_ctx.ip_buf);
3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n",
3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->nBufferCountActual, portDefn->nBufferSize);
3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorBadParameter;
3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (portDefn->eDir ==  OMX_DirMax)
3116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
3118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      (int)portDefn->nPortIndex);
3119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorBadPortIndex;
3120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoPortFormat:
3124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
3126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
3127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
3128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              portFmt->eColorFormat);
3129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(1 == portFmt->nPortIndex)
3131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         enum vdec_output_fromat op_format;
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           op_format = VDEC_YUV_FORMAT_NV12;
3135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else if(portFmt->eColorFormat ==
313640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka ||
313740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)
3138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           op_format = VDEC_YUV_FORMAT_TILE_4x2;
3139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
3140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           eRet = OMX_ErrorBadParameter;
3141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(eRet == OMX_ErrorNone && drv_ctx.output_format != op_format)
3143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
3144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           /*Set the output format*/
3145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           drv_ctx.output_format = op_format;
3146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           ioctl_msg.in = &drv_ctx.output_format;
3147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           ioctl_msg.out = NULL;
3148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_OUTPUT_FORMAT,
3149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 (void*)&ioctl_msg) < 0)
3150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           {
3151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("\n Set output format failed");
3152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorUnsupportedSetting;
3153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           }
315440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George           else {
3155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = get_buffer_req(&drv_ctx.op_buf);
315640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George           }
315740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George         }
315840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George         if (eRet == OMX_ErrorNone){
315940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George           if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
316040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             DEBUG_PRINT_ERROR("\n Set color format failed");
316140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             eRet = OMX_ErrorBadParameter;
316240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George           }
3163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
3165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexPortDefn:
3169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
3171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
3172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
3173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            portFmt->nFramePackingFormat);
3174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Input port */
3176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (portFmt->nPortIndex == 0)
3177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
3179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(secure_mode) {
3181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                arbitrary_bytes = false;
3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorUnsupportedSetting;
3184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
3185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               arbitrary_bytes = true;
3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes enabled");
3187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if (portFmt->nFramePackingFormat ==
3190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
3191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               arbitrary_bytes = false;
3193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes disabled");
3194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
3196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n",
3198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    portFmt->nFramePackingFormat);
3199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                eRet = OMX_ErrorUnsupportedSetting;
3200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
3203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
3205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
3207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
3208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_mem_region_smi = OMX_TRUE;
3210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
3213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_use_output_pmem = OMX_TRUE;
3214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     case OMX_IndexParamStandardComponentRole:
3221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     {
3222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_PARAM_COMPONENTROLETYPE *comp_role;
3223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
3224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
3225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       comp_role->cRole);
3226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if((m_state == OMX_StateLoaded)&&
3228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
3229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_LOW("Set Parameter called in valid state");
3231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
3233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             return OMX_ErrorIncorrectStateOperation;
3236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
3243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
3255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet = OMX_ErrorUnsupportedSetting;
3260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
3279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
3281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorUnsupportedSetting;
3284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
3288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
3289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  )
3290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
3297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
3305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
3306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    )
3307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
3309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
3311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
3319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
3321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               eRet = OMX_ErrorInvalidComponentName;
3322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     }
3325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPriorityMgmt:
3327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(m_state != OMX_StateLoaded)
3329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               return OMX_ErrorIncorrectStateOperation;
3332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
3334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
3335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              priorityMgmtype->nGroupID);
3336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
3338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             priorityMgmtype->nGroupPriority);
3339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
3341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
3344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamCompBufferSupplier:
3347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
3349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
3350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bufferSupplierType->eBufferSupplier);
3351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
3352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
3353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             else
3355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             eRet = OMX_ErrorBadPortIndex;
3357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoAvc:
3362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
3364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoH263:
3368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
3370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoMpeg4:
3374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
3376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoMpeg2:
3380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       case OMX_QcomIndexParamVideoDecoderPictureOrder:
3386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
3388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
3389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
3390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
3391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pictureOrder->eOutputPictureOrder);
3392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DISPLAY;
3394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DECODE;
3396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  time_stamp_dts.set_timestamp_reorder_mode(false);
3397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorBadParameter;
3400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (drv_ctx.idr_only_decoding)
3402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (pictureOrder->eOutputPictureOrder != QOMX_VIDEO_DECODE_ORDER)
3404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
3405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_HIGH("only decode order is supported for thumbnail mode");
3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      eRet = OMX_ErrorBadParameter;
3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
3408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.picture_order = pic_order;
3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ioctl_msg.in = &drv_ctx.picture_order;
3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ioctl_msg.out = NULL;
3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (void*)&ioctl_msg) < 0)
3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("\n Set picture order failed");
3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      eRet = OMX_ErrorUnsupportedSetting;
3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamConcealMBMapExtraData:
3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
3439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       break;
3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamInterlaceExtraData:
3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamH264TimeInfo:
3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoDivx:
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((divXType) && (divXType->eFormat == QOMX_VIDEO_DIVXFormat311)) {
3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: DivX 3.11 not supported in 7x30 core.");
3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexPlatformPvt:
3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_pvt_entry_pmem = OMX_TRUE;
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_use_output_pmem = OMX_TRUE;
3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.idr_only_decoding = 1;
3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          int rc = ioctl(drv_ctx.video_driver_fd,
3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      VDEC_IOCTL_SET_IDR_ONLY_DECODING);
3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(rc < 0) {
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorHardware;
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (eRet == OMX_ErrorNone)
3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set decode order for thumbnail mode");
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.picture_order = VDEC_ORDER_DECODE;
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ioctl_msg.in = &drv_ctx.picture_order;
3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ioctl_msg.out = NULL;
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (void*)&ioctl_msg) < 0)
3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("\n Set picture order failed");
3516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorUnsupportedSetting;
3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamIndexExtraDataType:
3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->bEnabled == OMX_TRUE) &&
3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->nPortIndex == 1))
3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              // Set smooth streaming parameter
3534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              int rc = ioctl(drv_ctx.video_driver_fd,
3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            VDEC_IOCTL_SET_CONT_ON_RECONFIG);
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(rc < 0) {
3537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorHardware;
3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
3543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Need to allow following two set_parameters even in Idle
3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * state. This is ANDROID architecture which is not in sync
3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * with openmax standard. */
3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(enableNativeBuffers) {
3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_enable_android_native_buffers = enableNativeBuffers->enable;
3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
3558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = use_android_native_buffer(hComp, paramData);
3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamEnableTimeStampReorder:
3564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
3566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) {
3567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE) {
3568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              frm_int =0;
3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              time_stamp_dts.set_timestamp_reorder_mode(true);
3570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            time_stamp_dts.set_timestamp_reorder_mode(false);
3573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
3574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          time_stamp_dts.set_timestamp_reorder_mode(false);
3575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE)
3576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    default:
3583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
3585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorUnsupportedIndex;
3586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
3589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3592e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetConfig
3594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3595e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Get Config Method implementation.
3597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3598e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3601e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
3603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3605e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
3606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_INDEXTYPE configIndex,
3607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_INOUT OMX_PTR     configData)
3608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_state == OMX_StateInvalid)
3612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     return OMX_ErrorInvalidState;
3615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch (configIndex)
3618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexConfigInterlaced:
3620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
3622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
3623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (configFmt->nPortIndex == 1)
3624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (configFmt->nIndex == 0)
3626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
3628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (configFmt->nIndex == 1)
3630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType =
3632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
3633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (configFmt->nIndex == 2)
3635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType =
3637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
3638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
3640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
3642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            " NoMore Interlaced formats\n");
3643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorNoMore;
3644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
3648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
3650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        (int)configFmt->nPortIndex);
3651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
3652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
3656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
3659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
3660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
3661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (void)(ioctl(drv_ctx.video_driver_fd,
3662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
3663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_QcomIndexConfigVideoFramePackingArrangement:
3666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
3668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
3671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_pack_data(configFmt);
3672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
3674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
3676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_QCOM_EXTRADATA_FRAMEINFO *extradata =
3682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_QCOM_EXTRADATA_FRAMEINFO *) configData;
3683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_extradata == NULL){
3685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("get_config: m_extradata not set. "
3686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            "Aspect Ratio information missing!!");
3687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        extradata->aspectRatio.aspectRatioX =
3690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_extradata->aspectRatio.aspectRatioX;
3691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         extradata->aspectRatio.aspectRatioY =
3692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_extradata->aspectRatio.aspectRatioY;
3693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    default:
3698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
3700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadParameter;
3701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
3706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3709e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SetConfig
3711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3712e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Set Config method implementation
3714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3715e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3718e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
3720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3721e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
3722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_INDEXTYPE configIndex,
3723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_PTR        configData)
3724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
3726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
3729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
3732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_VIDEO_CONFIG_NALSIZE *pNal;
3733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Set Config Called");
3735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_state == OMX_StateExecuting)
3737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
3739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     return ret;
3740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (configIndex == OMX_IndexVendorVideoExtraData)
3743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
3745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
3746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
3747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
3749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U32 extra_size;
3750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Parsing done here for the AVC atom is definitely not generic
3751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Currently this piece of code is working, but certainly
3752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // not tested with all .mp4 files.
3753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Incase of failure, we might need to revisit this
3754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // for a generic piece of code.
3755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Retrieve size of NAL length field
3757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // byte #4 contains the size of NAL lenght field
3758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      nal_length = (config->pData[4] & 0x03) + 1;
3759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      extra_size = 0;
3761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (nal_length > 2)
3762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
3764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        extra_size = (nal_length - 2) * 2;
3765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // SPS starts from byte #6
3768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
3769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 *pDestBuf;
3770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nPortIndex = config->nPortIndex;
3771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // minus 6 --> SPS starts from byte #6
3773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // minus 1 --> picture param set byte to be ignored from avcatom
3774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
3775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
3776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U32 len;
3777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 index = 0;
3778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // case where SPS+PPS is sent as part of set_config
3779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pDestBuf = m_vendor_config.pData;
3780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
3782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.nPortIndex,
3783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.nDataSize,
3784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.pData);
3785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      while (index < 2)
3786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        uint8 *psize;
3788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = *pSrcBuf;
3789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = len << 8;
3790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len |= *(pSrcBuf + 1);
3791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psize = (uint8 *) & len;
3792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
3793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        for (int i = 0; i < nal_length; i++)
3794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pDestBuf[i] = psize[nal_length - 1 - i];
3796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //memcpy(pDestBuf,pSrcBuf,(len+2));
3798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pDestBuf += len + nal_length;
3799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pSrcBuf += len + 2;
3800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        index++;
3801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pSrcBuf++;   // skip picture param set
3802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = 0;
3803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
3806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
3807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nPortIndex = config->nPortIndex;
3809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nDataSize = config->nDataSize;
3810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
3811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
3812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
3814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(m_vendor_config.pData)
3816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            free(m_vendor_config.pData);
3818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData = NULL;
3819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = 0;
3820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (((*((OMX_U32 *) config->pData)) &
3823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             VC1_SP_MP_START_CODE_MASK) ==
3824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             VC1_SP_MP_START_CODE)
3825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
3827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = config->nDataSize;
3829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData =
3830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (OMX_U8 *) malloc(config->nDataSize);
3831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData, config->pData,
3832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   config->nDataSize);
3833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_SP_MP_RCV;
3834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
3836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
3838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = config->nDataSize;
3840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData =
3841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (OMX_U8 *) malloc((config->nDataSize));
3842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData, config->pData,
3843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   config->nDataSize);
3844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_AP;
3845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
3847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
3849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize  = config->nDataSize;
3851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
3852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
3853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_SP_MP_RCV;
3854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
3856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
3858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return ret;
3861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if (configIndex == OMX_IndexConfigVideoNalSize)
3863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
3866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nal_length = pNal->nNaluBytes;
3867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_frame_parser.init_nal_length(nal_length);
3868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
3869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return ret;
3870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
3873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3876e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetExtensionIndex
3878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3879e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX GetExtensionIndex method implementaion.  <TBD>
3881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3882e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3885e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
3887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3889e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
3890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_IN OMX_STRING      paramName,
3891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_OUT OMX_INDEXTYPE* indexType)
3892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
3894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
3896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
3897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
3900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
3910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
3913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
3915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
3916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
3924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3930e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetState
3932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3933e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns the state information back to the caller.<TBD>
3935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3936e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3939e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Error None if everything is successful.
3941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3942e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
3943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_OUT OMX_STATETYPE* state)
3944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  *state = m_state;
3946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
3947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
3948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3951e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentTunnelRequest
3953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3954e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Component Tunnel Request method implementation. <TBD>
3956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3957e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
3959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3960e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
3962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3964e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
3965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_U32                        port,
3966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
3967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_U32                    peerPort,
3968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
3971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
3972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3975e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseOutputBuffer
3977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3978e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper function for Use buffer in the input pin
3980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3981e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
3983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3984e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
3986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
3989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
3990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
3991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
3992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
3993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
3994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
3995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
3998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned                         i= 0; // Temporary counter
3999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PTR privateAppData = NULL;
4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  private_handle_t *handle = NULL;
4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buff = buffer;
4006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr) {
4008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
4009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_output_headers();
4010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
4012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //allocate H264_mv_buffer
4014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = vdec_alloc_h264_mv();
4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eRet) {
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
4025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_out_bm_count,i))
4027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
4029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i >= drv_ctx.op_buf.actualcount) {
4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
40403d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if (m_use_android_native_buffers) {
40413d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
40423d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            sp<android_native_buffer_t> nBuf = params->nativeBuffer;
40433d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            handle = (private_handle_t *)nBuf->handle;
40443d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            privateAppData = params->pAppPrivate;
40453d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        } else {
40463d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            handle = (private_handle_t *)buff;
40473d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            privateAppData = appData;
4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
40493d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
40503d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
40513d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
40523d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                              " expected %u, got %lu",
40533d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                              drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
40543d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            return OMX_ErrorBadParameter;
4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
40563d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
40573d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if (!m_use_android_native_buffers) {
40583d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            if (!secure_mode) {
40593d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                buff =  (OMX_U8*)mmap(0, handle->size,
40603d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                                      PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
40613d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                if (buff == MAP_FAILED) {
40623d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                  DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
40633d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                  return OMX_ErrorInsufficientResources;
40643d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                }
40653d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            }
40663d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        }
40673d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_ICS_)
4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        native_buffer[i].nativehandle = handle;
4070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!handle) {
4072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
4077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
4079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else
4081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!ouput_egl_buffers && !m_use_output_pmem) {
4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
4088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].fd_ion_data,CACHED);
4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          open (MEM_DEVICE,O_RDWR);
4097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            open (MEM_DEVICE,O_RDWR);
4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
4107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size,
4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.alignment))
4114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
4121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].bufferaddr =
4122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
4123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              PROT_READ|PROT_WRITE, MAP_SHARED,
4124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
4125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
4126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return OMX_ErrorInsufficientResources;
4131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
4134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
4135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
4137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
4139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (!appData || !bytes )
4141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n Invalid appData or bytes");
4143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
4144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if(!secure_mode && !buffer)
4147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
4149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
4150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
4154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
4155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
4156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
4157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            !pmem_list->nEntries ||
4158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pmem_list->entryList->entry;
4164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          pmem_info->pmem_fd);
4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
4170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
4174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
4175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     *bufferHdr = (m_out_mem_ptr + i );
4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(secure_mode)
4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
4179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             sizeof (vdec_bufferpayload));
4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ioctl_msg.in  = &setbuffers;
4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ioctl_msg.out = NULL;
4185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
4187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
4188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          &ioctl_msg) < 0)
4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n Set output buffer failed");
4192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorInsufficientResources;
4193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     // found an empty buffer at i
4195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
4196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (m_enable_android_native_buffers) {
4197edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
4199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     } else {
4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (*bufferHdr)->pBuffer = buff;
4201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->pAppPrivate = privateAppData;
4203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     BITMASK_SET(&m_out_bm_count,i);
4204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4209e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::use_input_heap_buffers
4211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4212e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use Buffer Heap allocation method implementation.
4214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4215e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
4217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4218e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None , if everything successful.
4220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
4223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
4228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
4229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
4231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr)
4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
4234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
4236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_phdr_pmem_ptr)
4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
4241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficent memory");
4243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
4246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = true;
4248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
4249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
4251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
4253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
4254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
4256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
4257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL))
4258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_in_alloc_cnt++;
4263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
4267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4273e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::UseBuffer
4275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4276e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Use Buffer method implementation.
4278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4279e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
4281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4282e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None , if everything successful.
4284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4286e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::use_buffer(
4287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
4292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
4293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE error = OMX_ErrorNone;
4295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || bytes == 0)
4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("bad param 0x%p %ld",bufferHdr, bytes);
4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
4302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode && buffer == NULL) {
4305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("bad param 0x%p",buffer);
4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
4310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
4312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInvalidState;
4313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == OMX_CORE_INPUT_PORT_INDEX)
4315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
4316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
4317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
4318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
4321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = OMX_ErrorBadPortIndex;
4322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(error == OMX_ErrorNone)
4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
4327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Send the callback now
4329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandStateSet,OMX_StateIdle,
4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_EVENT);
4332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
4334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
4335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_CORE_INPUT_PORT_INDEX,
4339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_COMPONENT_GENERATE_EVENT);
4340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
4342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
4343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_CORE_OUTPUT_PORT_INDEX,
4347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_COMPONENT_GENERATE_EVENT);
4348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return error;
4351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
4355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_heap_ptr[bufferindex].pBuffer)
4359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free(m_inp_heap_ptr[bufferindex].pBuffer);
4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
4361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (pmem_bufferHdr)
4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer(pmem_bufferHdr);
4364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4367e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int index = 0;
4370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
4371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  index = bufferHdr - m_inp_mem_ptr;
4376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
4379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
4382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       struct vdec_setbuffer_cmd setbuffers;
4385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
4387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          sizeof (vdec_bufferpayload));
4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.in  = &setbuffers;
4389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.out = NULL;
4390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       int ioctl_r = ioctl (drv_ctx.video_driver_fd,
4391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
4392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       if (ioctl_r < 0)
4393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
4394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
4395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
4396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (!secure_mode) {
4397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
4398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
4399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
4400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].mmaped_size,
4401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
4402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
4403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.ptr_inputbuffer[index].mmaped_size);
4404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
4406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
4407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
4408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_desc_buffer_ptr[index].buf_addr);
4410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].buf_addr = NULL;
4411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].desc_data_size = 0;
4412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
4420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4422e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int index = 0;
4425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
4427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nfree_output_buffer ERROR");
4429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  index = bufferHdr - m_out_mem_ptr;
4433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
4434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.op_buf.actualcount
4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && drv_ctx.ptr_outputbuffer)
4437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
4440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_setbuffer_cmd setbuffers;
4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
4445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        sizeof (vdec_bufferpayload));
4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
4447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\nRelease the Output Buffer");
4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          &ioctl_msg) < 0)
4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
4452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
4455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!secure_mode) {
4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
4458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
4465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if(!secure_mode) {
4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
4468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].pmem_fd);
4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
4470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].mmaped_size,
4471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].bufferaddr);
4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr,
4473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].mmaped_size);
4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
4475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[index]);
4477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close (drv_ctx.ptr_outputbuffer[index].pmem_fd);
4479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_heap_ptr[index].video_heap_ptr = NULL;
4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_heap_count = m_heap_count - 1;
4483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (m_heap_count == 0)
4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
4485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    free(m_heap_ptr);
4486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    m_heap_ptr = NULL;
4487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
4488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
4489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
4496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    vdec_dealloc_h264_mv();
4498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
4502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4505e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
4506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_BUFFERHEADERTYPE **bufferHdr,
4507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32              port,
4508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_PTR              appData,
4509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32              bytes)
4510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *input = NULL;
4512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char *buf_addr = NULL;
4513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned   i = 0;
4515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* Sanity Check*/
4517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL)
4518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_inp_heap_ptr == NULL)
4523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
4525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
4528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_inp_heap_ptr == NULL)
4532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
4534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Find a Free index*/
4539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
4542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.ip_buf.actualcount)
4549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
4551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (buf_addr == NULL)
4553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *bufferHdr = (m_inp_heap_ptr + i);
4558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input = *bufferHdr;
4559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    BITMASK_SET(&m_heap_inp_bm_count,i);
4560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pBuffer           = (OMX_U8 *)buf_addr;
4562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nVersion.nVersion = OMX_SPEC_VERSION;
4564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pAppPrivate       = appData;
4566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
4568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
4569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] );
4570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Add the Buffers to freeq*/
4571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL))
4572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
4578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4588e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateInputBuffer
4590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4591e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper function for allocate buffer in the input pin
4593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4594e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
4596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4597e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
4599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4601e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
4602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes)
4607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_setbuffer_cmd setbuffers;
4611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *input = NULL;
4612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned   i = 0;
4614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char *buf_addr = NULL;
4615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int pmem_fd = -1;
4616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bytes != drv_ctx.ip_buf.buffer_size)
4618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
4620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes, drv_ctx.ip_buf.buffer_size);
4621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //return OMX_ErrorBadParameter;
4622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(!m_inp_mem_ptr)
4625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
4627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.actualcount,
4628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.buffer_size);
4629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_inp_mem_ptr == NULL)
4634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
4639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer == NULL)
4642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
4647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info == NULL)
4650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
4656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_inp_bm_count,i))
4667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i < drv_ctx.ip_buf.actualcount)
4674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Allocate input Buffer");
4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
4680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		    &drv_ctx.ip_buf_ion_info[i].fd_ion_data,CACHED);
4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
4683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pmem_fd < 0)
4690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pmem_fd == 0)
4696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
4698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pmem_fd < 0)
4700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInsufficientResources;
4703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.alignment))
4708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      close(pmem_fd);
4711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buf_addr = (unsigned char *)mmap(NULL,
4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ip_buf.buffer_size,
4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buf_addr == MAP_FAILED)
4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            close(pmem_fd);
4722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
4726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_inp_mem_ptr + i);
4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].offset = 0;
4738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer [i],
4741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            sizeof (vdec_bufferpayload));
4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
4744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
4746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         &ioctl_msg) < 0)
4747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set Buffers Failed");
4749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input = *bufferHdr;
4753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    BITMASK_SET(&m_inp_bm_count,i);
4754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer           = (OMX_U8 *)buf_addr;
4759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nVersion.nVersion = OMX_SPEC_VERSION;
4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pAppPrivate       = appData;
4763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.disable_dmx)
4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = allocate_desc_buffer(i);
4769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
4772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
4774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorInsufficientResources;
4775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4781e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateOutputBuffer
4783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4784e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper fn for AllocateBuffer in the output pin
4786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4787e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
4789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4790e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went well.
4792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4794e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
4795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes)
4800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
4803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned                         i= 0; // Temporary counter
4804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_setbuffer_cmd setbuffers;
4806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_device_fd =-1;
4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_allocation_data ion_alloc_data;
4809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_fd_data fd_ion_data;
4810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nBufHdrSize        = 0;
4813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPlatformEntrySize = 0;
4814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPlatformListSize  = 0;
4815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPMEMInfoSize = 0;
4816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int pmem_fd = -1;
4817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char *pmem_baseaddress = NULL;
4818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
4820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
4821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
4822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr)
4824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
4826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount,
4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size);
4828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
4830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
4834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
4836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
4838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
4840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
4841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
4843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_BUFFERHEADERTYPE),
4844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         nPMEMInfoSize,
4845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         nPlatformListSize);
4846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         drv_ctx.op_buf.actualcount);
4848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
4850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Alloc mem for platform specific info
4851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char *pPtr=NULL;
4852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
4853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     nPMEMInfoSize,1);
4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
4855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
4859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),
4863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr = (struct vidc_heap *)\
4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       calloc (sizeof(struct vidc_heap),
4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
4872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer
4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   && m_heap_ptr
4875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   )
4877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_outputbuffer[0].mmaped_size =
4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (drv_ctx.op_buf.buffer_size *
4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         drv_ctx.op_buf.actualcount);
4881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bufHdr          =  m_out_mem_ptr;
4882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
4883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
4884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        (((char *) m_platform_list)  + nPlatformListSize);
4885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        (((char *) m_platform_entry) + nPlatformEntrySize);
4887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPlatformList   = m_platform_list;
4888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPlatformEntry  = m_platform_entry;
4889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPMEMInfo       = m_pmem_info;
4890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
4892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Settting the entire storage nicely
4894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
4895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
4896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
4897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
4899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
4900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Set the values when we determine the right HxW param
4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
4902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nFilledLen         = 0;
4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
4904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
4905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Platform specific PMEM Information
4906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Initialize the Platform Entry
4907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
4908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
4909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry->entry      = pPMEMInfo;
4910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Initialize the Platform List
4911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList->nEntries    = 1;
4912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList->entryList   = pPlatformEntry;
4913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Keep pBuffer NULL till vdec is opened
4914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->pBuffer            = NULL;
4915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
4917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPMEMInfo->pmem_fd = 0;
4918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->pPlatformPrivate = pPlatformList;
4919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Create a mapping between buffers*/
4924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
4925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
4926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
4927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_heap_ptr[i].video_heap_ptr = NULL;
4929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Move the buffer and buffer header pointers
4931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr++;
4932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPMEMInfo++;
4933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry++;
4934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList++;
4935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eRet == OMX_ErrorNone && drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
4938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //Allocate the h264_mv_buffer
4940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = vdec_alloc_h264_mv();
4941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(eRet) {
4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
4949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
4951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        m_out_mem_ptr, pPtr);
4952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(m_out_mem_ptr)
4953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_out_mem_ptr);
4955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_out_mem_ptr = NULL;
4956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(pPtr)
4958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(pPtr);
4960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPtr = NULL;
4961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
4963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
4965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
4966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
4968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
4970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
4971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
4974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
4975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
4976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet =  OMX_ErrorInsufficientResources;
4980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for (i=0; i< drv_ctx.op_buf.actualcount; i++)
4984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_out_bm_count,i))
4986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Found a Free Output Buffer Index %d",i);
4988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.op_buf.actualcount)
4993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate Output Buffer");
4995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
4999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
5000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.op_buf_ion_info[i].fd_ion_data, CACHED);
5001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
5002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
5003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     }
5004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
5005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
5006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
5007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd < 0)
5009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
5011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf.buffer_size);
5012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd == 0)
5016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
5018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pmem_fd < 0)
5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
5022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           drv_ctx.op_buf.buffer_size);
5023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorInsufficientResources;
5024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size,
5028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.alignment))
5029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(pmem_fd);
5032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
5036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_baseaddress = (unsigned char *)mmap(NULL,
5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           drv_ctx.op_buf.buffer_size,
5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pmem_baseaddress == MAP_FAILED)
5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size);
5044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(pmem_fd);
5045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
5046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
5047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
5049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_out_mem_ptr + i);
5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer [i].bufferaddr = *bufferHdr;
5055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer [i].bufferaddr = pmem_baseaddress;
5057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].pmem_fd = pmem_fd;
5059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].buffer_len = drv_ctx.op_buf.buffer_size;
5060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].mmaped_size = drv_ctx.op_buf.buffer_size;
5061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].offset = 0;
5062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev #ifdef USE_ION
5065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr[i].video_heap_ptr = new VideoHeap (drv_ctx.op_buf_ion_info[i].ion_device_fd,
5066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                drv_ctx.op_buf.buffer_size,
5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_baseaddress,
5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ion_alloc_data.handle,
5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_fd);
5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_count = m_heap_count + 1;
507140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#else
5072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr[i].video_heap_ptr = new VideoHeap (pmem_fd,
5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                drv_ctx.op_buf.buffer_size,
5074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_baseaddress);
5075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
5079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr[i].video_heap_ptr.get ();
5081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
5082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd ;
5083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
5085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer [i],
5086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            sizeof (vdec_bufferpayload));
5087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
5088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
5089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
5091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
5092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         &ioctl_msg) < 0)
5093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Set output buffer failed");
5095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // found an empty buffer at i
5099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
5100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
5101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->pAppPrivate = appData;
5102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    BITMASK_SET(&m_out_bm_count,i);
5103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Output Buffer Index not found");
5108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
5109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
5111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// AllocateBuffer  -- API Call
5115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5116e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateBuffer
5118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5119e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns zero if all the buffers released..
5121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5122e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5125e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5129e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
5130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
5131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_U32                        port,
5132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_PTR                     appData,
5133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_U32                       bytes)
5134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned i = 0;
5136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
5137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
5139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
5140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
5142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
5143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(port == OMX_CORE_INPUT_PORT_INDEX)
5146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (arbitrary_bytes)
5148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
5150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
5152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
5154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
515840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
515940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                                                           appData,bytes);
5160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
5164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadPortIndex;
5165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
5167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(eRet == OMX_ErrorNone)
5168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(allocate_done()){
5170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
5171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
5173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
5174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandStateSet,OMX_StateIdle,
5175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_COMPONENT_GENERATE_EVENT);
5176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
5179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
5181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
5183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortEnable,
5184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_CORE_INPUT_PORT_INDEX,
5185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
5186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
5187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
5189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
5191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
5193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandPortEnable,
5194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_CORE_OUTPUT_PORT_INDEX,
5195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_COMPONENT_GENERATE_EVENT);
5196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
5200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return eRet;
5201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Free Buffer - API call
5204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5205e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::FreeBuffer
5207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5208e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5210e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5213e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5217e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_U32                 port,
5219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
5222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int nPortIndex;
5223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("In for decoder free_buffer \n");
5225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateIdle &&
5227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
5230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
5232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
5233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
5235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
5237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
5239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,
5240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_ErrorPortUnpopulated,
5241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
5242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
5244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (m_state != OMX_StateInvalid)
5246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
5248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,
5249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_ErrorPortUnpopulated,
5250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
5251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(port == OMX_CORE_INPUT_PORT_INDEX)
5254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /*Check if arbitrary bytes*/
5256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!arbitrary_bytes && !input_use_buffer)
5257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        nPortIndex = buffer - m_inp_mem_ptr;
5258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - m_inp_heap_ptr;
5260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
5262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.ip_buf.actualcount)
5263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // Clear the bit associated with it.
5265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
5267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (input_use_buffer == true)
5268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
5269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
5271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_phdr_pmem_ptr)
5272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
5273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
5275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
5276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (arbitrary_bytes)
5277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
5278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(m_phdr_pmem_ptr)
5279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
5281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,NULL);
5282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
5284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_input_buffer(buffer);
5285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_inp_bPopulated = OMX_FALSE;
5287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /*Free the Buffer Header*/
5288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (release_input_done())
5289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
5291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer_header();
5292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
5293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
5295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
5297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            eRet = OMX_ErrorBadPortIndex;
5298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
5301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           && release_input_done())
5302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
5305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            post_event(OMX_CommandPortDisable,
5306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       OMX_CORE_INPUT_PORT_INDEX,
5307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       OMX_COMPONENT_GENERATE_EVENT);
5308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // check if the buffer is valid
531340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
5314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.op_buf.actualcount)
5315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
5317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Clear the bit associated with it.
5318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
5319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_out_bPopulated = OMX_FALSE;
532040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            client_buffers.free_output_buffer (buffer);
5321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (release_output_done())
5323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_output_buffer_header();
5325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
5328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
5330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            eRet = OMX_ErrorBadPortIndex;
5331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
5333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           && release_output_done())
5334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
5336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
5339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (m_enable_android_native_buffers)
5341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
5342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
5343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
5345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandPortDisable,
5348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_CORE_OUTPUT_PORT_INDEX,
5349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_COMPONENT_GENERATE_EVENT);
5350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
5355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((eRet == OMX_ErrorNone) &&
5357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(release_done())
5360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Send the callback now
5362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
5363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            post_event(OMX_CommandStateSet, OMX_StateLoaded,
5364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_COMPONENT_GENERATE_EVENT);
5365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return eRet;
5368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5372e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::EmptyThisBuffer
5374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5375e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This routine is used to push the encoded video frames to
5377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  the video decoder.
5378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5379e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5382e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went successful.
5384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5386e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
5390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_config_flag = true;
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_config_flag = false;
5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
5403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
5405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
5406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL)
5409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
5411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_inp_bEnabled)
5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex);
5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(iDivXDrmDecrypt)
5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drmErr != OMX_ErrorNone) {
5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // this error can be ignored
5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!latency)
5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.stop();
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      latency = dec_time.processing_time_us();
5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.start();
5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (arbitrary_bytes)
5447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nBufferIndex = buffer - m_inp_heap_ptr;
5449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
5451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (input_use_buffer == true)
5453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_heap_ptr;
5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       buffer = &m_inp_mem_ptr[nBufferIndex];
5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else{
5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_mem_ptr;
5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
5468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
5470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
5475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (arbitrary_bytes)
5476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned)hComp,(unsigned)buffer,
5478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
5479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
5481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(buffer->nTimeStamp);
5484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
5485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5490e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::empty_this_buffer_proxy
5492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5493e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This routine is used to push the encoded video frames to
5495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  the video decoder.
5496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5497e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5500e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went successful.
5502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5504e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
5505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int push_cnt = 0,i=0;
5508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned nPortIndex = 0;
5509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
5510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_input_frameinfo frameinfo;
5511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_bufferpayload *temp_buffer;
5512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg;
5513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_seqheader seq_header;
5514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool port_setting_changed = true;
5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool not_coded_vop = false;
5517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Should we generate a Aync error event*/
5520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
5521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
5523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
5527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nPortIndex > drv_ctx.ip_buf.actualcount)
5529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
5531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        nPortIndex);
5532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pending_input_buffers++;
5536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
5540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer");
5542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EBD);
5544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
5549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4StreamType psBits;
5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
5551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.numBytes = buffer->nFilledLen;
5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4_headerparser.parseHeader(&psBits);
5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    not_coded_vop = mp4_headerparser.is_notcodec_vop(
5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(not_coded_vop) {
5556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\n Found Not coded vop len %d frame number %d",
5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             buffer->nFilledLen,frame_count);
5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
5559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          not_coded_vop = false;
5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          buffer->nFilledLen = 0;
5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(input_flush_progress == true
5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     || not_coded_vop
5569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     )
5571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
5573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
5575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
5579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
5581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
5586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*for use buffer we need to memcpy the data*/
5587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  temp_buffer->buffer_len = buffer->nFilledLen;
5588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (input_use_buffer)
5590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (buffer->nFilledLen <= temp_buffer->buffer_len)
5592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(arbitrary_bytes)
5594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
5598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
5600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->nFilledLen);
5601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
5606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.bufferaddr = temp_buffer->bufferaddr;
5611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.client_data = (void *) buffer;
5612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.datalen = temp_buffer->buffer_len;
5613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.flags = 0;
5614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.offset = buffer->nOffset;
5615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.pmem_fd = temp_buffer->pmem_fd;
5616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.pmem_offset = temp_buffer->offset;
5617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.timestamp = buffer->nTimeStamp;
5618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
5619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: dmx enabled");
5621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_demux_entries == 0)
5622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extract_demux_addr_offsets(buffer);
5624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
5627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    handle_demux_data(buffer);
5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
5629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
5630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = NULL;
5634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = 0;
5635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!arbitrary_bytes)
5637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frameinfo.flags |= buffer->nFlags;
5639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
5644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(arbitrary_bytes)
5646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
5651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (inputBufferFile1)
5660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite((const char *)temp_buffer->bufferaddr,
5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      temp_buffer->buffer_len,1,inputBufferFile1);
5663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
5673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
5676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_scratch.nFilledLen = 0;
5677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_count = 0;
5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_count = 0;
5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.mutils)
5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_frame_parser.mutils->initialize_frame_checking_environment();
5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.flush();
5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
5685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
5689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &frameinfo;
5691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
5692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
5693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            &ioctl_msg) < 0)
5694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Generate an async error and move to invalid state*/
5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy VDEC_IOCTL_DECODE_FRAME failed");
5697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!arbitrary_bytes)
5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Return failed buffer");
5700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EBD);
5702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else
5705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      time_stamp_dts.insert_timestamp(buffer);
5706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
5708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5711e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::FillThisBuffer
5713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5714e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL client uses this method to release the frame buffer
5716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  after displaying them.
5717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5718e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5721e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5725e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
5726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
5730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
5732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
5733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_bEnabled)
5736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
5738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
574140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer == NULL ||
574240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George     ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount))
5743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
5748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
5750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
575440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  post_event((unsigned) hComp, (unsigned)buffer,m_fill_output_msg);
5755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5758e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::fill_this_buffer_proxy
5760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5761e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL client uses this method to release the frame buffer
5763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  after displaying them.
5764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5765e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5768e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5772e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
5773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE        hComp,
5774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE nRet = OMX_ErrorNone;
5777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
5778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
5779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_fillbuffer_cmd fillbuffer;
5780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
5781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
5782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
578440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (bufferAdd == NULL || ((buffer - client_buffers.get_il_buf_hdr()) >
5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount) )
5786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
5789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bufferAdd, bufferAdd->pBuffer);
5790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Return back the output buffer to client*/
5791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
5792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
5795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pending_output_buffers++;
579940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
5800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
5801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ptr_respbuffer)
5802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
5804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
5807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer->nFilledLen = 0;
5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.FillBufferDone (hComp,m_app_data,buffer);
5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_output_buffers--;
5812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
5813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
5816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          sizeof(struct vdec_bufferpayload));
581740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  fillbuffer.client_data = buffer;
5818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Acquire a write lock on this buffer.
5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle,
5824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                  GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Failed to acquire genlock");
5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen = 0;
5827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_cb.FillBufferDone (hComp,m_app_data,buffer);
5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pending_output_buffers--;
5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[buffer - m_out_mem_ptr].inuse = true;
5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &fillbuffer;
5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,
5839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
5840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Decoder frame failed");
5842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
5844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Unlock the buffer
5846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
5847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Releasing genlock failed");
5848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
5849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
5850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[buffer - m_out_mem_ptr].inuse = false;
5851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_output_buffers--;
5856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5863e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SetCallbacks
5865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5866e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Set the callbacks.
5868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5869e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5872e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
5874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5876e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
5877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
5878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_PTR             appData)
5879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_cb       = *callbacks;
5882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
5883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               m_cb.EventHandler,m_cb.FillBufferDone);
5884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_app_data =    appData;
5885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
5886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5889e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentDeInit
5891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5892e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Destroys the component and release memory allocated to the heap.
5894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5895e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
5897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5898e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
5900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5902e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(iDivXDrmDecrypt)
5906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int i = 0;
5912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (OMX_StateLoaded != m_state)
5913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
5915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          m_state);
5916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
5917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
5921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5923fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secure_mode) {
5924fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      if (unsecureDisplay(qService::IQService::START) < 0) {
5925fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_HIGH("Failed to send message to unsecure display START");
5926fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      }
5927fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
5928fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
5929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if the output buffers have to be cleaned up*/
5930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_out_mem_ptr)
5931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Freeing the Output Memory\n");
5933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i < drv_ctx.op_buf.actualcount; i++ )
5934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          free_output_buffer (&m_out_mem_ptr[i]);
5936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_enable_android_native_buffers)
5938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (native_buffer[i].inuse)
5940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
5941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
5942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("Unlocking genlock failed");
5943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
5944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[i].inuse = false;
5945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
5946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if the input buffers have to be cleaned up*/
5955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_mem_ptr || m_inp_heap_ptr)
5956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Freeing the Input Memory\n");
5958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i<drv_ctx.ip_buf.actualcount; i++ )
5959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_inp_mem_ptr)
5961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,&m_inp_mem_ptr[i]);
5962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
5963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,NULL);
5964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
5968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(h264_scratch.pBuffer)
5969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
5975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
5977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	h264_parser = NULL;
5978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_platform_list)
5981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_platform_list);
5983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_platform_list = NULL;
5984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_vendor_config.pData)
5986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_vendor_config.pData);
5988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_vendor_config.pData = NULL;
5989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Reset counters in mesg queues
5992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.m_size=0;
5993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.m_size=0;
5994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.m_size=0;
5995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.m_read = m_ftb_q.m_write =0;
5996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.m_read = m_cmd_q.m_write =0;
5997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.m_read = m_etb_q.m_write =0;
5998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_debug_timestamp)
6000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.reset_ts_list();
6002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
6007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        NULL);
6008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Close the driver instance");
6009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* get strong count gets the refernce count of the pmem, the count will
6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * be incremented by our kernal driver and surface flinger, by the time
6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * we close the pmem, this cound needs to be zero, but there is no way
6013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * for us to know when surface flinger reduces its cound, so we wait
6014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * here in a infinite loop till the count is zero
6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    */
6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (m_heap_ptr)
6017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
6018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         for (int indx = 0; indx < drv_ctx.op_buf.actualcount; indx++)
6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_heap_ptr[indx].video_heap_ptr = NULL;
6020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_heap_ptr);
6021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_heap_ptr = NULL;
6022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_heap_count = 0;
6023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
6024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_
6025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(drv_ctx.video_driver_fd);
6026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
6027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputBufferFile1);
6031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
6034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6035fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
6036fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secure_mode) {
6037fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      if (unsecureDisplay(qService::IQService::END) < 0) {
6038fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_HIGH("Failed to send message to unsecure display STOP");
6039fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      }
6040fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
6041fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
6042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
6043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6047e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::UseEGLImage
6049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6050e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Use EGL Image method implementation <TBD>.
6052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6053e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
6055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6056e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Not Implemented error.
6058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6060e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
6061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
6062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_U32                        port,
6063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_PTR                     appData,
6064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN void*                      eglImage)
6065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
6068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   EGLint fd = -1, offset = 0,pmemPtr = 0;
6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int fd = -1, offset = 0;
6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("\n ");
6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_display_id == NULL) {
6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
6086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    eglGetProcAddress("eglQueryImageKHR");
6087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
6089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
6091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
6093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
6095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
6096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
6097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
6098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (temp_egl_id != NULL)
6099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
6101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
6102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
6105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
6106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.pmem_fd = (OMX_U32) fd;
6109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.offset = (OMX_U32) offset;
6110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.entry = (void *) &pmem_info;
6111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
6112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.entryList = &pmem_entry;
6113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.nEntries = 1;
6114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ouput_egl_buffers = true;
6115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
6116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
6117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_U8 *)pmemPtr)) {
6118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
6119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorInsufficientResources;
6120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return OMX_ErrorNone;
6122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6125e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentRoleEnum
6127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6128e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Component Role Enum method implementation.
6130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6131e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
6133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6134e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything is successful.
6136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6137e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
6138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_OUT OMX_U8*        role,
6139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_IN OMX_U32        index)
6140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
6142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
6144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
6146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
6148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
6153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
6156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
6158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
6160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
6165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
6168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
6172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
6177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
6181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
6182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
6183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          )
6184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
6185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
6186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
6191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
6200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
6204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
6213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
6214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           )
6215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
6219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
6230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorInvalidComponentName;
6231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
6233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6239e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateDone
6241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6242e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if entire buffer pool is allocated by IL Client or not.
6244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Need this to move to IDLE state.
6245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6246e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6249e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_done(void)
6254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet_In = false;
6257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet_Out = false;
6258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet_In = allocate_input_done();
6260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet_Out = allocate_output_done();
6261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(bRet_In && bRet_Out)
6263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6270e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateInputDone
6272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6273e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if I/P buffer pool is allocated by IL Client or not.
6275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6276e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6279e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_input_done(void)
6284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0;
6287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_inp_mem_ptr == NULL)
6289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return bRet;
6291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_inp_mem_ptr )
6293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;i<drv_ctx.ip_buf.actualcount;i++)
6295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(BITMASK_ABSENT(&m_inp_bm_count,i))
6297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
6299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i == drv_ctx.ip_buf.actualcount)
6303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
6306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
6308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     m_inp_bPopulated = OMX_TRUE;
6310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6314e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateOutputDone
6316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6317e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if entire O/P buffer pool is allocated by IL Client or not.
6319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6320e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6323e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_output_done(void)
6328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned j=0;
6331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_out_mem_ptr == NULL)
6333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return bRet;
6335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
6338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;j < drv_ctx.op_buf.actualcount;j++)
6340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(BITMASK_ABSENT(&m_out_bm_count,j))
6342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
6344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(j == drv_ctx.op_buf.actualcount)
6349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
6352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_bEnabled)
6353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_out_bPopulated = OMX_TRUE;
6354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6360e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseDone
6362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6363e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6366e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6369e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_done(void)
6374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(release_input_done())
6378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(release_output_done())
6380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bRet = true;
6382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6389e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseOutputDone
6391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6392e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6395e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6398e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_output_done(void)
6403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0,j=0;
6406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
6408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_out_mem_ptr)
6409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j < drv_ctx.op_buf.actualcount ; j++)
6411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT(&m_out_bm_count,j))
6413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
6415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j == drv_ctx.op_buf.actualcount)
6418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_out_bm_count = 0;
6420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_out_bm_count = 0;
6426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6431e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseInputDone
6433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6434e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6437e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6440e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_input_done(void)
6445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0,j=0;
6448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
6450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_inp_mem_ptr)
6451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j<drv_ctx.ip_buf.actualcount;j++)
6453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if( BITMASK_PRESENT(&m_inp_bm_count,j))
6455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
6457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j==drv_ctx.ip_buf.actualcount)
6460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
6472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_BUFFERHEADERTYPE * buffer)
6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
6475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
6477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
6479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (output_flush_progress)
6482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
6484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
6485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nTimeStamp = 0;
6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
6489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char value[PROPERTY_VALUE_MAX];
6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.panframedata", value, NULL);
6494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (atoi(value))
6496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
6498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n");
6500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
6502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
6506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n");
6508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
6510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer, buffer->pBuffer);
6517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_output_buffers --;
6518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Output EOS has been reached");
6522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!output_flush_progress)
6523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
6524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame)
6526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
6528e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
6529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame)
6531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen = 0;
6533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
6534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame = NULL;
6535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
6539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputBufferFile1)
6541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6542edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U32 index = buffer - m_out_mem_ptr;
6543edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
6544edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
6545edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    fwrite (pBuffer,1,buffer->nFilledLen,
6546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  outputBufferFile1);
6547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* For use buffer we need to copy the data */
6551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!output_flush_progress)
6552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.get_next_timestamp(buffer,
6554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
6555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ?true:false);
6556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_cb.FillBufferDone)
6558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFilledLen > 0)
6560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata)
6562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        handle_extradata(buffer);
6563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep min timestamp interval to handle corrupted bit stream scenario
6565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        set_frame_rate(buffer->nTimeStamp);
6566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (arbitrary_bytes)
6567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        adjust_timestamp(buffer->nTimeStamp);
6568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (perf_flag)
6570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!proc_frms)
6572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.stop();
6574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          latency = dec_time.processing_time_us() - latency;
6575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
6576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.start();
6577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.start();
6578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        proc_frms++;
6580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_U64 proc_time = 0;
6583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.stop();
6584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_time = fps_metrics.processing_time_us();
6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
6586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            proc_frms, (float)proc_time / 1e6,
6587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (float)(1e6 * proc_frms) / proc_time);
6588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_frms = 0;
6589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
6592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputExtradataFile)
6595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6597edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U32 index = buffer - m_out_mem_ptr;
6598edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
6599edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
6600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
6601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *)
6602edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George           ((unsigned)(pBuffer + buffer->nOffset +
6603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen + 3)&(~3));
6604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra &&
6605edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George          (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) )
6606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
6608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
6609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == OMX_ExtraDataNone)
6610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
6614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
6619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = LLONG_MAX;
6620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rst_prev_ts = true;
6621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
6624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
6625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->pPlatformPrivate)->entryList->entry;
6626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
6627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
6628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
6629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (native_buffer[buffer - m_out_mem_ptr].inuse) {
6631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
6632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Unlocking genlock failed");
6633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
6636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        native_buffer[buffer - m_out_mem_ptr].inuse = false;
6637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
6639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
664140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    OMX_BUFFERHEADERTYPE *il_buffer;
664240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    il_buffer = client_buffers.get_il_buf_hdr(buffer);
664340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (il_buffer)
664440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
664540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else {
664640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
664740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorBadParameter;
664840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
664940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
6650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
6651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
6655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6660e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
6661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_BUFFERHEADERTYPE* buffer)
6662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
6665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
6667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       return OMX_ErrorBadParameter;
6668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer, buffer->pBuffer);
6672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pending_input_buffers--;
6673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (arbitrary_bytes)
6675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame == NULL && input_flush_progress == false)
6677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
6679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = buffer;
6680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nTimeStamp = LLONG_MAX;
6682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        push_input_buffer (hComp);
6683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
6685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
6687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL))
6689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
6691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_cb.EmptyBufferDone)
6695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (input_use_buffer == true){
6698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
6703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint omx_vdec::async_message_process (void *context, void* message)
6707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec* omx = NULL;
6709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_msginfo *vdec_msg = NULL;
6710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
6711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_output_frameinfo *output_respbuf = NULL;
6712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (context == NULL || message == NULL)
6714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
6716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return -1;
6717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  vdec_msg = (struct vdec_msginfo *)message;
6719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx = reinterpret_cast<omx_vdec*>(context);
6721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (omx->m_debug_timestamp)
6724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
6726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         !(omx->output_flush_progress) )
6727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_TICKS expected_ts = 0;
6729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->m_timestamp_list.pop_min_ts(expected_ts);
6730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
6731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
6732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
6734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
6736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch (vdec_msg->msgcode)
6742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_EVT_HW_ERROR:
6745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_START_DONE:
6750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_START_DONE);
6752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_STOP_DONE:
6755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_STOP_DONE);
6757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_RESUME_DONE:
6760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_RESUME_DONE);
6762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_PAUSE_DONE:
6765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
6767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
6770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
6772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
6774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
6776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_INPUT_FLUSHED:
6778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
6779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxhdr = (OMX_BUFFERHEADERTYPE* )\
6781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              vdec_msg->msgdata.input_frame_clientdata;
6782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (omxhdr == NULL ||
6785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
6786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       omxhdr = NULL;
6788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       vdec_msg->status_code = VDEC_S_EFATAL;
6789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EBD);
6793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int64_t *timestamp;
6796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      timestamp = (int64_t *) malloc(sizeof(int64_t));
6797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (timestamp) {
6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
6799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
6801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             vdec_msg->msgdata.output_frame.time_stamp);
6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
6807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxhdr = (OMX_BUFFERHEADERTYPE*)vdec_msg->msgdata.output_frame.client_data;
6808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
6810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      vdec_msg->msgdata.output_frame.pic_type);
6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* update SYNCFRAME flag */
6813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omx->eCompressionFormat == OMX_VIDEO_CodingAVC)
6814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* set SYNCFRAME flag if picture type is IDR for h264 */
6816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_IDR)
6817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
6818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
6820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* set SYNCFRAME flag if picture type is I_TYPE */
6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_I)
6825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
6826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
6828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omxhdr && omxhdr->pOutputPortPrivate &&
6831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
6832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
6833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
6834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
6836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
6838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
6839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
6840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nFlags = (vdec_msg->msgdata.output_frame.flags);
6841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf = (struct vdec_output_frameinfo *)\
6843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          omxhdr->pOutputPortPrivate;
6844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.bottom =
6845090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.bottom;
6846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.left =
6847090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.left;
6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.right =
6849090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.right;
6850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.top =
6851090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.top;
6852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
6853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
6854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
6855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
6856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
6857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
6858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->aspect_ratio_info =
6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           vdec_msg->msgdata.output_frame.aspect_ratio_info;
6860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (omx->output_use_buffer)
6863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ( omxhdr->pBuffer,
6864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (vdec_msg->msgdata.output_frame.bufferaddr +
6865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.offset),
6866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.len );
6867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
6869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nFilledLen = 0;
6870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
6871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_FBD);
6872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
6874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EOS_DONE);
6876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_CONFIG_CHANGED:
6881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed");
6882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_PORT_RECONFIG);
6884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
6886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed info");
6888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // get_buffer_req and populate port defn structure
6889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
6890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->m_port_def.nPortIndex = 1;
6891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = omx->update_portdef(&(omx->m_port_def));
6892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
6894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  default:
6897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return 1;
6900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6902e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
6903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   OMX_HANDLETYPE hComp,
6904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   OMX_BUFFERHEADERTYPE *buffer
6905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                           )
6906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
6908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Empty this arbitrary");
6909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL)
6911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
6913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
6915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
6916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
6917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
6919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return buffer if input flush in progress */
6920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
6921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
6922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
6924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
6925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
6926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (psource_frame == NULL)
6929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
6931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    psource_frame = buffer;
6932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
6933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    push_input_buffer (hComp);
6934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
6938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL))
6939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
6941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6948e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
6951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
6952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (pdest_frame == NULL || psource_frame == NULL)
6954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if we have a destination buffer*/
6956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame == NULL)
6957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
6959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_free_q.m_size)
6960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_free_q.pop_entry(&address,&p2,&id);
6962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
6963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame->nFilledLen = 0;
6964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = LLONG_MAX;
6965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
6966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if we have a destination buffer*/
6970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame == NULL)
6971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
6973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_pending_q.m_size)
6974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_pending_q.pop_entry(&address,&p2,&id);
6976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
6977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
6978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                psource_frame->nTimeStamp);
6979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
6980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame->nFlags,psource_frame->nFilledLen);
6981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while ((pdest_frame != NULL) && (psource_frame != NULL))
6988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch (codec_type_parse)
6990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_MPEG4:
6992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_H263:
6993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_MPEG2:
6994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret =  push_input_sc_codec(hComp);
6995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
6996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_H264:
6997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret = push_input_h264(hComp);
6998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
6999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_VC1:
7000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret = push_input_vc1(hComp);
7001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
7002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ret != OMX_ErrorNone)
7004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
7006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      omx_report_error ();
7007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
7008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
7012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7014e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
7015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_U32 partial_frame = 1;
7017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
7018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
7019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
7021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame,psource_frame->nTimeStamp);
7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_frame_parser.parse_sc_frame(psource_frame,
7023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       pdest_frame,&partial_frame) == -1)
7024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
7026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
7027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (partial_frame == 0)
7030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
7032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pdest_frame->nFilledLen,psource_frame,frame_count);
7033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
7036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*First Parsed buffer will have only header Hence skip*/
7037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (frame_count == 0)
7038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
7041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         codec_type_parse == CODEC_TYPE_DIVX) {
7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4StreamType psBits;
7044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.numBytes = pdest_frame->nFilledLen;
7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4_headerparser.parseHeader(&psBits);
7047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      frame_count++;
7050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pdest_frame->nFilledLen)
7055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
7057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
7062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
7063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_input_free_q.m_size)
7065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_input_free_q.pop_entry(&address,&p2,&id);
7067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
7068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen = 0;
7069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
7072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
7074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
7075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
7076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
7080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
7082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if Destination Buffer is full*/
7083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame->nAllocLen ==
7084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame->nFilledLen + pdest_frame->nOffset)
7085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
7087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorStreamCorrupt;
7088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (psource_frame->nFilledLen == 0)
7092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
7094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame)
7096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags |= psource_frame->nFlags;
7098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
7099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
7100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
7101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame->nFilledLen,frame_count++);
7102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Push the frame to the Decoder*/
7103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        frame_count++;
7108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = NULL;
7109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
7113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
7114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly   }
7116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(generate_ebd)
7117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
7119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
7121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (m_input_pending_q.m_size)
7123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
7125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_pending_q.pop_entry(&address,&p2,&id);
7126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
7127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
7128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                psource_frame->nTimeStamp);
7129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
7130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame->nFlags,psource_frame->nFilledLen);
7131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly   }
7134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
7135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7137e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
7138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_U32 partial_frame = 1;
7140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
7141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BOOL isNewFrame = OMX_FALSE;
7142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
7143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (h264_scratch.pBuffer == NULL)
7145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
7147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
7148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
7150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
7151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
7152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (h264_scratch.nFilledLen && look_ahead_nal)
7153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    look_ahead_nal = false;
7155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         h264_scratch.nFilledLen)
7157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              h264_scratch.pBuffer,h264_scratch.nFilledLen);
7160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
7162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      h264_scratch.nFilledLen = 0;
7163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
7167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
7168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nal_length == 0)
7171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
7173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_sc_frame(psource_frame,
7174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
7175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
7177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
7178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_h264_nallength(psource_frame,
7184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
7185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
7187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
7188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (partial_frame == 0)
7192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
7194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
7196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nal_count++;
7197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
7198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nFlags = psource_frame->nFlags;
7199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(h264_scratch.nFilledLen)
7204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 NALU_TYPE_SPS);
7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
7211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // If timeinfo is present frame info from SEI is already processed
7213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
7215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
7217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_count++;
7218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
7219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nTimeStamp = h264_last_au_ts;
7220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFlags = h264_last_au_flags;
7221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR
7222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_parser->update_panscan_data(h264_last_au_ts);
7224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
7227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = h264_scratch.nTimeStamp;
7229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_flags = h264_scratch.nFlags;
7230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
7233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
7234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (!VALID_TS(h264_last_au_ts))
7235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_last_au_ts = ts_in_sei;
7236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
7237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else
7239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = LLONG_MAX;
7240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!isNewFrame)
7243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen)
7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
7248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.nFilledLen);
7249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.pBuffer,h264_scratch.nFilledLen);
7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
7253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
7254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_scratch.nFilledLen = 0;
7255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
7257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
7259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        look_ahead_nal = true;
7265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
7266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
7267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
7268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,frame_count++);
7269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pdest_frame->nFilledLen == 0)
7271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
7273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          look_ahead_nal = false;
7274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               h264_scratch.nFilledLen)
7276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
7279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            h264_scratch.nFilledLen = 0;
7281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
7283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
7285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            return OMX_ErrorBadParameter;
7286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
7291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Reset the EOS Flag");
7293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /*Push the frame to the Decoder*/
7296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
7299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
7300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          //frame_count++;
7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = NULL;
7302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_input_free_q.m_size)
7303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
7304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_input_free_q.pop_entry(&address,&p2,&id);
7305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
7306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
7307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen = 0;
7308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags = 0;
7309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = LLONG_MAX;
7310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
7318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if Destination Buffer is full*/
7319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_scratch.nAllocLen ==
7320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.nFilledLen + h264_scratch.nOffset)
7321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
7323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorStreamCorrupt;
7324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!psource_frame->nFilledLen)
7328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
7330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
7332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame)
7334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
7336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             h264_scratch.nFilledLen)
7338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  h264_scratch.pBuffer,h264_scratch.nFilledLen);
7341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          h264_scratch.nFilledLen = 0;
7343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
7347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
7351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
7352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (frame_count == 0)
7353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_HIGH("No frames sent to driver yet, "
7355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              "So send zero length EOS buffer");
7356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           pdest_frame->nFilledLen = 0;
7357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("pdest_frame->nFilledLen = %d, nFlags = 0x%x, TimeStamp = %x",
7360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen, pdest_frame->nFlags, pdest_frame->nTimeStamp);
7361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
7362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!VALID_TS(pdest_frame->nTimeStamp))
7367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = ts_in_sei;
7368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Push the frame to the Decoder*/
7371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        frame_count++;
7376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = NULL;
7377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
7381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame,h264_scratch.nFilledLen);
7382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
7383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(generate_ebd && !psource_frame->nFilledLen)
7387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psource_frame = NULL;
7390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_input_pending_q.m_size)
7391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
7393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_pending_q.pop_entry(&address,&p2,&id);
7394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
7395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
7396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame->nFlags,psource_frame->nFilledLen);
7397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
7400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7402e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
7403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U8 *buf, *pdest;
7405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U32 partial_frame = 1;
7406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U32 buf_len, dest_len;
7407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(first_frame == 0)
7409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        first_frame = 1;
7411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
7412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(!m_vendor_config.pData)
7413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
7415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            buf = psource_frame->pBuffer;
7416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            buf_len = psource_frame->nFilledLen;
7417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
7419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                VC1_SP_MP_START_CODE)
7420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_vc1_profile = VC1_SP_MP_RCV;
7422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
7424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_vc1_profile = VC1_AP;
7426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
7428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
7430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorStreamCorrupt;
7431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
7436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nOffset;
7437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
7438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nOffset);
7439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(dest_len < m_vendor_config.nDataSize)
7441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\nDestination buffer full\n");
7443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorBadParameter;
7444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
7446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
7448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
7449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch(m_vc1_profile)
7454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case VC1_AP:
7456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
7457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
7458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
7460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorBadParameter;
7461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
7463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case VC1_SP_MP_RCV:
7465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        default:
7466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n");
7467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            return OMX_ErrorBadParameter;
7468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
7470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
7473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
7474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_U32 alignment)
7475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct pmem_allocation allocation;
7477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  allocation.size = buffer_size;
7478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  allocation.align = clip2(alignment);
7479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (allocation.align < 4096)
7480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    allocation.align = 4096;
7482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
7484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
7487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return false;
7488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return true;
7490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7491090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly#endif
7492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	      struct ion_fd_data *fd_data,int flag)
7497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int fd = -EINVAL;
7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -EINVAL;
7500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_dev_flag;
7501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ion ion_buf_info;
7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!alloc_data || buffer_size <= 0 || !fd_data) {
7503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
7504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return -EINVAL;
7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode && flag == CACHED)
7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ion_dev_flag = O_RDONLY;
7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7510e1b75ccf790ae63be6a99f617a1927d1e003cac9Haynes Mathew George    ion_dev_flag = (O_RDONLY | O_DSYNC);
7511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd = open (MEM_DEVICE, ion_dev_flag);
7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (fd < 0) {
7514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
7515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return fd;
7516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->len = buffer_size;
7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->align = clip2(alignment);
7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (alloc_data->align < 4096)
7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->align = 4096;
7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(secure_mode) {
7524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_SECURE);
7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_HEAP(ION_IOMMU_HEAP_ID));
7527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc || !alloc_data->handle) {
7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->handle = NULL;
7532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
7535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd_data->handle = alloc_data->handle;
7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_MAP,fd_data);
7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc) {
7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION MAP failed ");
7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_alloc_data = *alloc_data;
7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_device_fd = fd;
7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.fd_ion_data = *fd_data;
7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_ion_memory(&ion_buf_info);
7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd_data->fd =-1;
7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return fd;
7550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(!buf_ion_info) {
7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
7556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return;
7557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
7559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             &buf_ion_info->ion_alloc_data.handle)) {
7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free failed" );
7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     close(buf_ion_info->ion_device_fd);
7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_device_fd = -1;
7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_alloc_data.handle = NULL;
7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->fd_ion_data.fd = -1;
7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
7569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
7571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_use_buffer = false;
7572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ouput_egl_buffers = false;
7573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
7575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (m_out_mem_ptr);
7577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = NULL;
7578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_platform_list)
7581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free(m_platform_list);
7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_platform_list = NULL;
7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_respbuffer)
7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_respbuffer);
7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = NULL;
7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_outputbuffer)
7592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_outputbuffer);
7594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = NULL;
7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (arbitrary_bytes)
7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_frame_parser.mutils)
7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free utils parser");
7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete (m_frame_parser.mutils);
7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils = NULL;
7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_inp_heap_ptr)
7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input Heap Pointer");
7620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_inp_heap_ptr);
7621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_inp_heap_ptr = NULL;
7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_phdr_pmem_ptr)
7625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
7627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_phdr_pmem_ptr);
7628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_phdr_pmem_ptr = NULL;
7629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_mem_ptr)
7632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
7634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (m_inp_mem_ptr);
7635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_inp_mem_ptr = NULL;
7636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer)
7638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Driver Context pointer");
7640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (drv_ctx.ptr_inputbuffer);
7641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer = NULL;
7642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
7645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free ion context");
7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.ip_buf_ion_info);
7647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int buf_size = 0, extra_data_size = 0;
7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = buffer_prop;
7661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_GET_BUFFER_REQ,
7662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (void*)&ioctl_msg) < 0)
7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = buffer_prop->buffer_size;
7670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
7674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_INTERLACE_EXTRADATA)
7676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Interlace extra data enabled!");
7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_PORTDEF_EXTRADATA)
7681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
7683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         extra_data_size);
7685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (extra_data_size)
7687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
7690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size += extra_data_size;
7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
7694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig) // BufReq will be set to driver when port is disabled
7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (buf_size != buffer_prop->buffer_size)
7698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = set_buffer_req(buffer_prop);
7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
7709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned buf_size = 0;
7713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buf_size != buffer_prop->buffer_size)
7717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
7719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size, buf_size);
7720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadParameter;
7721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = buffer_prop;
7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_BUFFER_REQ,
7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (void*)&ioctl_msg) < 0)
7728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Setting buffer requirements failed");
7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInsufficientResources;
773140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
773240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!client_buffers.update_buffer_req()) {
773340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
773440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        eRet = OMX_ErrorInsufficientResources;
773540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      }
7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::start_port_reconfig()
7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  eRet = update_picture_resolution();
7746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone)
7747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = &drv_ctx.interlace;
7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_INTERLACE_FORMAT, &ioctl_msg))
7750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_INTERLACE_FORMAT");
7752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorHardware;
7753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("Interlace format detected (%x)!", drv_ctx.interlace);
7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            client_extradata |= OMX_INTERLACE_EXTRADATA;
7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("secure mode interlaced format not supported");
7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
7764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      in_reconfig = true;
7767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
7768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = get_buffer_req(&op_buf_rcnfg);
7769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = &drv_ctx.video_resolution;
7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg))
7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
7783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorHardware;
7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!portDefn)
7792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
7796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
7797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nSize = sizeof(portDefn);
7798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->eDomain    = OMX_PortDomainVideo;
7799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.frame_rate.fps_denominator > 0)
7800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
7801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        drv_ctx.frame_rate.fps_denominator;
7802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else {
7803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
7804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (0 == portDefn->nPortIndex)
7807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirInput;
7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
7812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = eCompressionFormat;
7814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_inp_bEnabled;
7815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_inp_bPopulated;
7816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (1 == portDefn->nPortIndex)
7818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirOutput;
7820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (update_picture_resolution() != OMX_ErrorNone)
7821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ALOGE(" update_picture_resolution failed \n");
7823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorHardware;
7824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
782540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.update_buffer_req()) {
782640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
782740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
782840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
7829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig)
7830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
7832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = op_buf_rcnfg.mincount;
7833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = op_buf_rcnfg.buffer_size;
7834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
7838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = drv_ctx.op_buf.buffer_size;
7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
784140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    unsigned int buf_size = 0;
784240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.get_buffer_req(buf_size)) {
784340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n update buffer requirements");
784440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
784540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
784640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    portDefn->nBufferSize = buf_size;
7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
7848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_out_bEnabled;
7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_out_bPopulated;
785040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
785140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Error in getting color format");
785240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir = OMX_DirMax;
7858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
7859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->nPortIndex);
7860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
7861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
7865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("update_portdef Width = %d Height = %d Stride = %u"
7867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "SliceHeight = %u \n", portDefn->format.video.nFrameHeight,
7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nFrameWidth,
7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nStride,
7870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nSliceHeight);
7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i= 0;
7880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_out_mem_ptr) {
7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nBufHdrSize        = 0;
7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformEntrySize = 0;
7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformListSize  = 0;
7886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPMEMInfoSize = 0;
7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
7889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
7894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
7895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
7897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
7898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
7899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
7900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
7901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
7902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
7904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE),
7905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPMEMInfoSize,
7906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPlatformListSize);
7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
7908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         m_out_bm_count);
7909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
7910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Alloc mem for platform specific info
7911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *pPtr=NULL;
7912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     nPMEMInfoSize,1);
7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
7915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer)
7927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufHdr          =  m_out_mem_ptr;
7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
7930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
7931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_list)  + nPlatformListSize);
7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_entry) + nPlatformEntrySize);
7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList   = m_platform_list;
7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry  = m_platform_entry;
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo       = m_pmem_info;
7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Settting the entire storage nicely
7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_ptr,pPlatformEntry);
7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
7945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Set the values when we determine the right HxW param
7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nFilledLen         = 0;
7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
7952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->entry      = pPMEMInfo;
7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform List
7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->nEntries    = 1;
7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->entryList   = pPlatformEntry;
7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep pBuffer NULL till vdec is opened
7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pBuffer            = NULL;
7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->pmem_fd = 0;
7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pPlatformPrivate = pPlatformList;
7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Create a mapping between buffers*/
7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Move the buffer and buffer header pointers
7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr++;
7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo++;
7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry++;
7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList++;
7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        m_out_mem_ptr, pPtr);
7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_out_mem_ptr)
7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_out_mem_ptr);
7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_out_mem_ptr = NULL;
7986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPtr)
7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPtr);
7990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPtr = NULL;
7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
8001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =  OMX_ErrorInsufficientResources;
8010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
8012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet =  OMX_ErrorInsufficientResources;
8013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p1;
8020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p2;
8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned ident;
8022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_cmd_queue tmp_q, pending_bd_q;
8023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE FDB from ftb queue
8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_ftb_q.m_size)
8026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.pop_entry(&p1,&p2,&ident);
8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_FBD)
8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to ftb queue
8038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
8039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
8041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.insert_entry(p1,p2,ident);
8042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE EDB from etb queue
8044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_etb_q.m_size)
8045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.pop_entry(&p1,&p2,&ident);
8047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_EBD)
8048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
8050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
8054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to etb queue
8057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
8058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
8060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.insert_entry(p1,p2,ident);
8061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
8063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // process all pending buffer dones
8064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(pending_bd_q.m_size)
8065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_bd_q.pop_entry(&p1,&p2,&ident);
8067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(ident)
8068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_EBD:
8070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
8071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
8073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
8074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
8076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_FBD:
8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
8079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
8082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
8084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 new_frame_interval = 0;
8091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
8093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
8094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    new_frame_interval = (act_timestamp > prev_ts)?
8096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          act_timestamp - prev_ts :
8097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          prev_ts - act_timestamp;
8098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (new_frame_interval < frm_int || frm_int == 0)
8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frm_int = new_frame_interval;
8101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(frm_int)
8102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_numerator = 1e6;
8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_denominator = frm_int;
8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
8106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         frm_int, drv_ctx.frame_rate.fps_numerator /
8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         (float)drv_ctx.frame_rate.fps_denominator);
8108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl_msg.in = &drv_ctx.frame_rate;
8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (void*)&ioctl_msg) < 0)
8111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("Setting frame rate failed");
8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prev_ts = act_timestamp;
8118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
8121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rst_prev_ts && VALID_TS(act_timestamp))
8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = act_timestamp;
8125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = false;
8126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (VALID_TS(prev_ts))
8128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bool codec_cond = (drv_ctx.timestamp_adjust)?
8130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
8132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
8133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(frm_int > 0 && codec_cond)
8134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
8136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      act_timestamp = prev_ts + frm_int;
8137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
8138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = act_timestamp;
8139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(act_timestamp);
8142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (frm_int > 0)           // In this case the frame rate was set along
8144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {                               // with the port definition, start ts with 0
8145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
8147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
8153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_conceal_MB = 0;
8154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_S64 ts_in_sei = 0;
8155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 frame_rate = 0;
8156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8157edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
8158edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
8159edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
8160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_extra = (OMX_OTHER_EXTRADATATYPE *)
8161edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George           ((unsigned)(pBuffer + p_buf_hdr->nOffset +
8162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_buf_hdr->nFilledLen + 3)&(~3));
8163edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
8164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = NULL;
8165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
8166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Process driver extradata
8168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
8169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
8171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
8172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->nSize < p_extra->nDataSize)
8173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
8175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          p_extra->nSize, p_extra->nDataSize);
8176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8177edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George        if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
8178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_extra->nDataSize == 0 || p_extra->nSize == 0)
8179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra = NULL;
8180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          continue;
8181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
8183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
8185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          num_conceal_MB = count_MB_in_extradata(p_extra);
8186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
8187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Map driver extradata to corresponding OMX type
8188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
8189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
8190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_debug_concealedmb) {
8193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
8194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
8196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_SEI)
8198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_sei = p_extra;
8200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_VUI)
8206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_vui = p_extra;
8208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
8210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      print_debug_extradata(p_extra);
8214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8215edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George      if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
8216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->nDataSize == 0 || p_extra->nSize == 0)
8217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = NULL;
8218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
8220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Driver extradata is only exposed if MB map is requested by client,
8222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // otherwise can be overwritten by omx extradata.
8223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *)
8224edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George               ((unsigned)(pBuffer + p_buf_hdr->nOffset +
8225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                p_buf_hdr->nFilledLen + 3)&(~3));
8226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
8227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
8231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_TIMEINFO_EXTRADATA)
8234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_vui)
8236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
8237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_sei)
8238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
8240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!VALID_TS(p_buf_hdr->nTimeStamp))
8241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp = ts_in_sei;
8242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
8244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // If timeinfo is present frame info from SEI is already processed
8245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
8249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
8250edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_interlace_extradata(p_extra,
8254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format);
8255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
8258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
8259edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* vui extra data (frame_rate) information */
8263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
8264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_rate(&frame_rate);
8265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_frame_info_extradata(p_extra, num_conceal_MB,
8266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
8267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp, frame_rate,
8268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &((struct vdec_output_frameinfo *)
8269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
8270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
8273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       p_extra != NULL &&
8274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
8275edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_portdef_extradata(p_extra);
8279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
8282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (p_extra &&
8283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
8284edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George        (pBuffer + p_buf_hdr->nAllocLen))
8285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      append_terminator_extradata(p_extra);
8286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
8289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
8290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
8294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
8296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 driver_extradata = 0, extradata_size = 0;
8297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
8298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state != OMX_StateLoaded)
8299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
8301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorIncorrectStateOperation;
8302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
8304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
8305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_INTERLACE_EXTRADATA)
8306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
8307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_PORTDEF_EXTRADATA)
8308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
8310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
8312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata, requested_extradata, enable);
8313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (enable)
8315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata |= client_extradata;
8316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata = client_extradata & ~requested_extradata;
8319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size *= -1;
8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
8323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
8324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
8325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
8326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
8329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
8330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
8332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (driver_extradata != drv_ctx.extradata)
8336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.extradata = driver_extradata;
8339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.extradata;
8340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
8341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (void*)&ioctl_msg) < 0)
8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nSet extradata failed");
8345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = OMX_ErrorUnsupportedSetting;
8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ret = get_buffer_req(&drv_ctx.op_buf);
8349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
8351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_size += extradata_size;
8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // align the buffer size
8355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan 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));
8356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size);
8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
8359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = set_buffer_req(&drv_ctx.op_buf);
8360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
8362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *data_ptr = extra->data, data = 0;
8368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (byte_count < extra->nDataSize)
8369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data = *data_ptr;
8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (data)
8372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      num_MB += (data&0x01);
8374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      data >>= 1;
8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data_ptr++;
8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    byte_count++;
8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
8380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
8382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_debug_extradata)
8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return;
8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH(
8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "============== Extra Data ==============\n"
8392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Size: %u \n"
8393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "        Version: %u \n"
8394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "      PortIndex: %u \n"
8395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Type: %x \n"
8396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "       DataSize: %u \n",
8397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nSize, extra->nVersion.nVersion,
8398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nPortIndex, extra->eType, extra->nDataSize);
8399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (extra->eType == OMX_ExtraDataInterlaceFormat)
8401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "------ Interlace Format ------\n"
8405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "                Size: %u \n"
8406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Version: %u \n"
8407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           PortIndex: %u \n"
8408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Is Interlace Format: %u \n"
8409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Interlace Formats: %u \n"
8410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "=========== End of Interlace ===========\n",
8411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
8412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
8413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataFrameInfo)
8415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "-------- Frame Format --------\n"
8420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Picture Type: %u \n"
8421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Interlace Type: %u \n"
8422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Pan Scan Total Frame Num: %u \n"
8423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Concealed Macro Blocks: %u \n"
8424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "               frame rate: %u \n"
8425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio X: %u \n"
8426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio Y: %u \n",
8427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->ePicType,
8428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->interlaceType,
8429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->panScan.numWindows,
8430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nConcealedMacroblocks,
8431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nFrameRate,
8432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioX,
8433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioY);
8434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (int i = 0; i < fminfo->panScan.numWindows; i++)
8436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH(
8438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "------------------------------\n"
8439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "     Pan Scan Frame Num: %d \n"
8440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle x: %d \n"
8441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle y: %d \n"
8442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dx: %d \n"
8443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dy: %d \n",
8444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
8445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
8446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
8449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataNone)
8451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
8453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
8457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
8459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_U32 interlaced_format_type)
8463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STREAMINTERLACEFORMAT *interlace_format;
8465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 mbaff = 0;
8466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
8467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
8470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
8474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
8476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((interlaced_format_type == VDEC_InterlaceFrameProgressive)  && !mbaff)
8477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_FALSE;
8479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
8480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
8481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_TRUE;
8485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
8486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
8487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp,
8493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 frame_rate, struct vdec_aspectratioinfo *aspect_ratio_info)
8494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
8496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
8497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
8500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
8501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (picture_type)
8504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_I:
8506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
8507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_P:
8509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
8510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_B:
8512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
8513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
8515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
8516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
8518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
8519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
8520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
8521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
8523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->panScan,0,sizeof(frame_info->panScan));
8524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
8525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
8528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fill_aspect_ratio_info(aspect_ratio_info, frame_info);
8531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nConcealedMacroblocks = num_conceal_mb;
8532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nFrameRate = frame_rate;
8533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::fill_aspect_ratio_info(
8537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       struct vdec_aspectratioinfo *aspect_ratio_info,
8538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
8539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata = frame_info;
8541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata->aspectRatio.aspectRatioX = 0;
8543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata->aspectRatio.aspectRatioY = 0;
8544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     h264_parser->fill_aspect_ratio_info(&m_extradata->aspectRatio);
8548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG4 ||
8551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_3 ||
8552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4 ||
8553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5 ||
8554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_6)
8555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      mp4_fill_aspect_ratio_info(aspect_ratio_info,m_extradata);
8557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_extradata->aspectRatio.aspectRatioX == 0 ||
8560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_extradata->aspectRatio.aspectRatioY == 0) {
8561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_extradata->aspectRatio.aspectRatioX = 1;
8562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_extradata->aspectRatio.aspectRatioY = 1;
8563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
8569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
8570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
8573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
8574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
8575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  *portDefn = m_port_def;
8576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
8577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
8578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nFrameWidth,
8579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nStride,
8580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nSliceHeight);
8581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
8586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = OMX_ExtraDataNone;
8588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = 0;
8589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->data[0] = 0;
8590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
8595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
8597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index >= drv_ctx.ip_buf.actualcount)
8598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
8600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr = (desc_buffer_hdr*) \
8605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(desc_buffer_hdr)),
8606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
8607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_desc_buffer_ptr == NULL)
8608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
8610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
8615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr[index].buf_addr == NULL)
8616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
8618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
8625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
8627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_demux_entries < 8192)
8628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_offsets[m_demux_entries++] = address_offset;
8630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
8635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
8637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
8638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 index = 0;
8639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (index < bytes_to_parse)
8643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
8646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x01)) )
8648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //Found start code, insert address offset
8650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      insert_demux_addr_offset(index);
8651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf[index+2] == 0x01) // 3 byte start code
8652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 3;
8653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else                      //4 byte start code
8654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 4;
8655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index++;
8658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
8660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //fix this, handle 3 byte start code, vc1 terminator entry
8666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *p_demux_data = NULL;
8667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 desc_data = 0;
8668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 start_addr = 0;
8669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 nal_size = 0;
8670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 suffix_byte = 0;
8671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 demux_index = 0;
8672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 buffer_index = 0;
8673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
8677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
8681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer_index > drv_ctx.ip_buf.actualcount)
8682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index);
8684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
8688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ( ((OMX_U8*)p_demux_data == NULL) ||
8690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
8691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
8693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (; demux_index < m_demux_entries; demux_index++)
8698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      start_addr = m_demux_offsets[demux_index];
8701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
8702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
8704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
8708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (demux_index < (m_demux_entries - 1))
8710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
8712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
8716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
8718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        start_addr,
8719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        suffix_byte,
8720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nal_size,
8721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        demux_index);
8722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = (start_addr >> 3) << 1;
8723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= (start_addr & 7) << 21;
8724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= suffix_byte << 24;
8725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
8728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (codec_type_parse == CODEC_TYPE_VC1)
8734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("VC1 terminator entry");
8736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0x82 << 24;
8738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
8740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_demux_entries++;
8744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //Add zero word to indicate end of descriptors
8746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(p_demux_data, 0, sizeof(OMX_U32));
8747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
8749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
8750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
8752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Demux table complete!");
8754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
8755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::vdec_alloc_h264_mv()
8759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 pmem_fd = -1;
8761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 width, height, size, alignment;
8762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  void *buf_addr = NULL;
8763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg;
8764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
8765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem_allocation allocation;
8766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_h264_mv h264_mv;
8768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_mv_buff_size mv_buff_size;
8769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mv_buff_size.width = drv_ctx.video_resolution.stride;
8771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mv_buff_size.height = drv_ctx.video_resolution.scan_lines>>2;
8772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
8774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = (void*)&mv_buff_size;
8775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_GET_MV_BUFFER_SIZE, (void*)&ioctl_msg) < 0)
8777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n GET_MV_BUFFER_SIZE Failed for width: %d, Height %d" ,
8779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      mv_buff_size.width, mv_buff_size.height);
8780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("GET_MV_BUFFER_SIZE returned: Size: %d and alignment: %d",
8784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    mv_buff_size.size, mv_buff_size.alignment);
8785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  size = mv_buff_size.size * drv_ctx.op_buf.actualcount;
8787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alignment = mv_buff_size.alignment;
8788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Entered vdec_alloc_h264_mv act_width: %d, act_height: %d, size: %d, alignment %d\n",
8790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height,size,alignment);
8791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.h264_mv.ion_device_fd = alloc_map_ion_memory(
8795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    size, 8192,
8796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.h264_mv.ion_alloc_data,
8797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.h264_mv.fd_ion_data,CACHED);
8798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.h264_mv.ion_device_fd < 0) {
8799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
8800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = drv_ctx.h264_mv.fd_ion_data.fd;
8802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
8803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.size = size;
8804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.align = clip2(alignment);
8805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (allocation.align != 8192)
8806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    allocation.align = 8192;
8807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = open(MEM_DEVICE, O_RDWR);
8809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((int)(pmem_fd) < 0)
8811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
8814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
8816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
8817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode) {
8821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_addr = mmap(NULL, size,
8822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   PROT_READ | PROT_WRITE,
8823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   MAP_SHARED, pmem_fd, 0);
8824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf_addr == (void*) MAP_FAILED)
8826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        close(pmem_fd);
8828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free_ion_memory(&drv_ctx.h264_mv);
8830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_fd = -1;
8832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
8833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
8834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   } else
8836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_addr =(unsigned char *) (pmem_fd + 1234);
8837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Allocated virt:%p, FD: %d of size %d count: %d \n", buf_addr,
8838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   pmem_fd, size, drv_ctx.op_buf.actualcount);
8839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.size = size;
8841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.count = drv_ctx.op_buf.actualcount;
8842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.pmem_fd = pmem_fd;
8843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.offset = 0;
8844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = (void*)&h264_mv;
8846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
8847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_H264_MV_BUFFER, (void*)&ioctl_msg) < 0)
8849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Failed to set the H264_mv_buffers\n");
8851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.buffer = (unsigned char *) buf_addr;
8855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.size = size;
8856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.count = drv_ctx.op_buf.actualcount;
8857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.offset = 0;
8858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.pmem_fd = pmem_fd;
8859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Saving virt:%p, FD: %d of size %d count: %d \n", h264_mv_buff.buffer,
8860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   h264_mv_buff.pmem_fd, h264_mv_buff.size, drv_ctx.op_buf.actualcount);
8861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
8862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::vdec_dealloc_h264_mv()
8865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(h264_mv_buff.pmem_fd > 0)
8867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_H264_MV_BUFFER,NULL) < 0)
8869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_H264_MV_BUFFER failed");
8870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
8871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          munmap(h264_mv_buff.buffer, h264_mv_buff.size);
8872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(h264_mv_buff.pmem_fd);
8873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free_ion_memory(&drv_ctx.h264_mv);
8875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Cleaning H264_MV buffer of size %d \n",h264_mv_buff.size);
8877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.pmem_fd = -1;
8878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.offset = 0;
8879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.size = 0;
8880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.count = 0;
8881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.buffer = NULL;
8882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::createDivxDrmContext()
8889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = OMX_ErrorNone;
8891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     iDivXDrmDecrypt = DivXDrmDecrypt::Create();
8892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (iDivXDrmDecrypt) {
8893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
8894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(err!=OMX_ErrorNone) {
8895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
8896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
8897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
8898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
8899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
8901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
8902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          err = OMX_ErrorUndefined;
8903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return err;
8905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
8906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
8907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
890840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
890940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
891040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  enabled = false;
891140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx = NULL;
891240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  init_members();
891340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  ColorFormat = OMX_COLOR_FormatMax;
891440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
891540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
891640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
891740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
891840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx = reinterpret_cast<omx_vdec*>(client);
891940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
892040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
892140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::init_members() {
892240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  allocated_count = 0;
892340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer_size_req = 0;
892440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer_alignment_req = 0;
892540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_platform_list_client,0,sizeof(m_platform_list_client));
892640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
892740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
892840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
892940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
893040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  for (int i = 0; i < MAX_COUNT;i++)
893140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    pmem_fd[i] = -1;
893240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
893340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
893440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
893540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  c2d.destroy();
893640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
893740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
893840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::update_buffer_req()
893940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
894040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
894140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int src_size = 0, destination_size = 0;
894240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE drv_color_format;
894340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
894440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
894540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
894640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
894740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled){
894840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n No color conversion required");
894940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return status;
895040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
895140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_TILE_4x2 &&
895240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      ColorFormat != OMX_COLOR_FormatYUV420Planar) {
895340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
895440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
895540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
895640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  c2d.close();
895740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
895840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                    omx->drv_ctx.video_resolution.frame_width,
895940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                    YCbCr420Tile,YCbCr420P);
896040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status) {
896140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    status = c2d.get_buffer_size(C2D_INPUT,src_size);
896240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (status)
896340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
896440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
896540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status) {
896640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
896740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        !destination_size) {
896840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
896940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            "driver size %d destination size %d",
897040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
897140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
897240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      c2d.close();
897340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      buffer_size_req = 0;
897440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
897540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      buffer_size_req = destination_size;
897640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
897740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George	     buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
897840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
897940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
898040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
898140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
898240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
898340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
898440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
898540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::set_color_format(
898640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE dest_color_format)
898740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
898840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
898940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE drv_color_format;
899040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
899140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
899240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
899340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
899440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
899540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    drv_color_format = (OMX_COLOR_FORMATTYPE)
899640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
899740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else {
899840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Incorrect color format");
899940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    status = false;
900040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
900140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status && (drv_color_format != dest_color_format)) {
900240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("");
900340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
900440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
900540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
900640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
900740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      ColorFormat = OMX_COLOR_FormatYUV420Planar;
900840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (enabled)
900940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        c2d.destroy();
901040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      enabled = false;
901140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!c2d.init()) {
901240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("\n open failed for c2d");
901340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        status = false;
901440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      } else
901540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        enabled = true;
901640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
901740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  } else {
901840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (enabled)
901940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      c2d.destroy();
902040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    enabled = false;
902140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
902240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
902340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
902440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
902540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
902640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
902740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
902840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
902940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
903040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
903140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
903240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return omx->m_out_mem_ptr;
903340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return m_out_mem_ptr_client;
903440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
903540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
903640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
903740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George       (OMX_BUFFERHEADERTYPE *bufadd)
903840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
903940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
904040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
904140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
904240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
904340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
904440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return bufadd;
904540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned index = 0;
904640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufadd - omx->m_out_mem_ptr;
904740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index < omx->drv_ctx.op_buf.actualcount) {
904840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
904940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
905040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    bool status;
905140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!omx->in_reconfig && !omx->output_flush_progress) {
905240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
905340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  bufadd->pBuffer,pmem_fd[index],pmem_baseaddress[index]);
905440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
905540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!status){
905640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
905740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        return NULL;
905840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      }
905940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else
906040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_out_mem_ptr_client[index].nFilledLen = 0;
906140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return &m_out_mem_ptr_client[index];
906240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
906340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
906440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return NULL;
906540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
906640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
906740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
906840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                                              (OMX_BUFFERHEADERTYPE *bufadd)
906940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
907040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
907140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
907240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
907340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
907440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
907540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return bufadd;
907640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned index = 0;
907740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufadd - m_out_mem_ptr_client;
907840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index < omx->drv_ctx.op_buf.actualcount) {
907940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return &omx->m_out_mem_ptr[index];
908040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
908140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
908240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return NULL;
908340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
908440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_buffer_req
908540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          (unsigned int &buffer_size)
908640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
908740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
908840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    buffer_size = omx->drv_ctx.op_buf.buffer_size;
908940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else
909040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
909140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Get buffer size failed");
909240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return false;
909340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
909440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
909540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        buffer_size = omx->drv_ctx.op_buf.buffer_size;
909640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
909740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George	  buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
909840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return true;
909940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
910040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
910140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE *bufhdr) {
910240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int index = 0;
910340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
910440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
910540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return omx->free_output_buffer(bufhdr);
910640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (enabled && omx->is_component_secure())
910740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorNone;
910840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!allocated_count || !bufhdr) {
910940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
911040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
911140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
911240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufhdr - m_out_mem_ptr_client;
911340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index >= omx->drv_ctx.op_buf.actualcount){
911440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
911540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
911640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
911740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (pmem_fd[index] > 0) {
911840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    munmap(pmem_baseaddress[index], buffer_size_req);
911940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    close(pmem_fd[index]);
912040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
912140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_fd[index] = -1;
912240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx->free_ion_memory(&op_buf_ion_info[index]);
912340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_heap_ptr[index].video_heap_ptr = NULL;
912440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (allocated_count > 0)
912540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    allocated_count--;
912640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else
912740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    allocated_count = 0;
912840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!allocated_count) {
912940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    c2d.close();
913040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    init_members();
913140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
913240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
913340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
913440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
913540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
913640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
913740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
913840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_ERRORTYPE eRet = OMX_ErrorNone;
913940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled){
914040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
914140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return eRet;
914240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
914340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (enabled && omx->is_component_secure()) {
914440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
914540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                      omx->is_component_secure());
914640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorUnsupportedSetting;
914740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
914840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!bufferHdr || bytes > buffer_size_req) {
914940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
915040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %d",
915140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                      buffer_size_req,bytes);
915240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
915340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
915440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
915540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
915640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
915740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
915840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
915940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
916040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George         port,appData,omx->drv_ctx.op_buf.buffer_size);
916140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (eRet != OMX_ErrorNone || !temp_bufferHdr){
916240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
916340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return eRet;
916440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
916540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
916640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      omx->drv_ctx.op_buf.actualcount) {
916740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid header index %d",
916840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             (temp_bufferHdr - omx->m_out_mem_ptr));
916940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorUndefined;
917040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
917140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int i = allocated_count;
917240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
917340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    buffer_size_req,buffer_alignment_req,
917440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,CACHED);
917540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
917640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
917740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (op_buf_ion_info[i].ion_device_fd < 0) {
917840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
917940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
918040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
918140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
918240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                     PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
918340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
918440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (pmem_baseaddress[i] == MAP_FAILED) {
918540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
918640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    close(pmem_fd[i]);
918740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    omx->free_ion_memory(&op_buf_ion_info[i]);
918840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
918940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
919040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_heap_ptr[i].video_heap_ptr = new VideoHeap (
919140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    op_buf_ion_info[i].ion_device_fd,buffer_size_req,
919240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
919340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
919440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_pmem_info_client[i].offset = 0;
919540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
919640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
919740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_list_client[i].nEntries = 1;
919840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_list_client[i].entryList = &m_platform_entry_client[i];
919940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
920040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
920140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nFilledLen = 0;
920240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nFlags = 0;
920340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
920440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
920540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
920640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
920740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
920840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pAppPrivate = appData;
920940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  *bufferHdr = &m_out_mem_ptr_client[i];
921040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
921140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  allocated_count++;
921240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return eRet;
921340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
921440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
921540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::is_component_secure()
921640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
921740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return secure_mode;
921840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
921940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
922040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
922140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
922240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
922340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled) {
922440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
922540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George     dest_color_format =  (OMX_COLOR_FORMATTYPE)
922640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
922740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
922840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      dest_color_format = OMX_COLOR_FormatYUV420SemiPlanar;
922940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else
923040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
923140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  } else {
923240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
923340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
923440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else
923540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      dest_color_format = OMX_COLOR_FormatYUV420Planar;
923640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
923740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
923840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
9239fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9240fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::secureDisplay(int mode) {
9241fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (m_secure_display == true) {
9242fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        return 0;
9243fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9244fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9245fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<IServiceManager> sm = defaultServiceManager();
9246fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<qService::IQService> displayBinder =
9247fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        interface_cast<qService::IQService>(sm->getService(String16("display.qservice")));
9248fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9249fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (displayBinder != NULL) {
9250fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        displayBinder->securing(mode);
9251fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        if (mode == qService::IQService::END) {
9252fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George            m_secure_display = true;
9253fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        }
9254fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9255fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    else {
9256fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_ERROR("secureDisplay(%d) display.qservice unavailable", mode);
9257fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9258fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    return 0;
9259fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George}
9260fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9261fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::unsecureDisplay(int mode) {
9262fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (m_secure_display == false) {
9263fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        return 0;
9264fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9265fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9266fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (mode == qService::IQService::END) {
9267fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        m_secure_display = false;
9268fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9269fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9270fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<IServiceManager> sm = defaultServiceManager();
9271fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<qService::IQService> displayBinder =
9272fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        interface_cast<qService::IQService>(sm->getService(String16("display.qservice")));
9273fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9274fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (displayBinder != NULL)
9275fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        displayBinder->unsecuring(mode);
9276fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    else
9277fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_ERROR("unsecureDisplay(%d) display.qservice unavailable", mode);
9278fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    return 0;
9279fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George}
9280