omx_vdec.cpp revision 57550cf78d0e21406efd278ad44069674b2e1813
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    }
2360e77c68a64ef47b33ae1ae6f5a45152420336b36aHaynes Mathew George    else if(ident == OMX_COMPONENT_GENERATE_ETB)
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;
2477e77c68a64ef47b33ae1ae6f5a45152420336b36aHaynes Mathew George  DEBUG_PRINT_LOW("\n Value of this pointer in post_event 0x%x", p2);
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 {
2884a370c157f9ab6a5d4576820acd09dd4239879ffaHaynes Mathew George                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP);
2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (MAX_RES_720P) ||  defined (MAX_RES_1080P_EBI)
2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P
2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else {
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorBadParameter;
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =OMX_ErrorUnsupportedIndex;
2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_width,
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.frame_height,
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.stride,
2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.video_resolution.scan_lines);
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((params == NULL) ||
2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer == NULL) ||
2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (params->nativeBuffer->handle == NULL) ||
2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      !m_enable_android_native_buffers)
2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
29333d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
29343d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George    if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
29353d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
29363d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                          " expected %u, got %lu",
29373d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                          drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
29383d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        return OMX_ErrorBadParameter;
29393d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George    }
29403d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer = (OMX_U8*)mmap(0, handle->size,
2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(buffer == MAP_FAILED) {
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    return OMX_ErrorInsufficientResources;
2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
2959e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
2960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::Setparameter
2961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2962e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
2963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Set Parameter method implementation.
2964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2965e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
2966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
2967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2968e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
2969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
2970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
2972e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
2973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_INDEXTYPE paramIndex,
2974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_PTR        paramData)
2975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
2978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
2980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
2982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
2983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(paramData == NULL)
2985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
2987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         return OMX_ErrorBadParameter;
2988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((m_state != OMX_StateLoaded) &&
2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_out_bEnabled == OMX_TRUE) &&
2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (m_inp_bEnabled == OMX_TRUE)) {
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch(paramIndex)
2999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPortDefinition:
3001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
3003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
3004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //been called.
3006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
3007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             (int)portDefn->format.video.nFrameHeight,
3008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             (int)portDefn->format.video.nFrameWidth);
3009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(OMX_DirOutput == portDefn->eDir)
3010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
301157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          eRet = update_color_format(portDefn->format.video.eColorFormat);
301257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          if (eRet != OMX_ErrorNone) {
301357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George            DEBUG_PRINT_ERROR("\n Setparam: color format failed for %u",
301457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George                              portDefn->format.video.eColorFormat);
301557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George            break;
301657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          }
301757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
3018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_display_id = portDefn->format.video.pNativeWindow;
301940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          unsigned int buffer_size;
302040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          if (!client_buffers.get_buffer_req(buffer_size)) {
302140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
302240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            eRet = OMX_ErrorBadParameter;
302340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          } else {
302440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
302540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                 portDefn->nBufferSize >=  buffer_size)
302640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George              {
302740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
302840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
302940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                eRet = set_buffer_req(&drv_ctx.op_buf);
303040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                if (eRet == OMX_ErrorNone)
303140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                    m_port_def = *portDefn;
303240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            }
303340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            else
3034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
303540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                DEBUG_PRINT_HIGH("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
303640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
303740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  portDefn->nBufferCountActual, portDefn->nBufferSize);
303840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                eRet = OMX_ErrorBadParameter;
303940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            }
3040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(OMX_DirInput == portDefn->eDir)
3043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((portDefn->format.video.xFramerate >> 16) > 0 &&
3045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
3046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Frame rate only should be set if this is a "known value" or to
3048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // activate ts prediction logic (arbitrary mode only) sending input
3049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // timestamps with max value (LLONG_MAX).
3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %d",
3051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             portDefn->format.video.xFramerate >> 16);
3052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
3053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          drv_ctx.frame_rate.fps_denominator);
3054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!drv_ctx.frame_rate.fps_numerator)
3055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
3057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = 30;
3058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(drv_ctx.frame_rate.fps_denominator)
3060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_numerator = (int)
3061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
3062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.frame_rate.fps_denominator = 1;
3063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
3064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      drv_ctx.frame_rate.fps_numerator;
3065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            ioctl_msg.in = &drv_ctx.frame_rate;
3066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
3067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       (void*)&ioctl_msg) < 0)
3068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
3070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
3072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             frm_int, drv_ctx.frame_rate.fps_numerator /
3073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (float)drv_ctx.frame_rate.fps_denominator);
3074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
3076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(drv_ctx.video_resolution.frame_height !=
3077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameHeight ||
3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.video_resolution.frame_width  !=
3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->format.video.nFrameWidth)
3080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         {
3081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
3082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameWidth,
3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           portDefn->format.video.nFrameHeight);
3084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             if (portDefn->format.video.nFrameHeight != 0x0 &&
3085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 portDefn->format.video.nFrameWidth != 0x0)
3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             {
3087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.video_resolution.frame_height =
3088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 drv_ctx.video_resolution.scan_lines =
3089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 portDefn->format.video.nFrameHeight;
3090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.video_resolution.frame_width =
3091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 drv_ctx.video_resolution.stride =
3092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 portDefn->format.video.nFrameWidth;
3093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ioctl_msg.in = &drv_ctx.video_resolution;
3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ioctl_msg.out = NULL;
3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (void*)&ioctl_msg) < 0)
3097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               {
3098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   DEBUG_PRINT_ERROR("\n Set Resolution failed");
3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = OMX_ErrorUnsupportedSetting;
3100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               }
3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               else
3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   eRet = get_buffer_req(&drv_ctx.op_buf);
3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = set_buffer_req(&drv_ctx.ip_buf);
3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
3114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n",
3115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
3116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portDefn->nBufferCountActual, portDefn->nBufferSize);
3117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             eRet = OMX_ErrorBadParameter;
3118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (portDefn->eDir ==  OMX_DirMax)
3121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
3123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      (int)portDefn->nPortIndex);
3124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorBadPortIndex;
3125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamVideoPortFormat:
3129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
3131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
3132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
3133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              portFmt->eColorFormat);
3134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(1 == portFmt->nPortIndex)
313657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          eRet = update_color_format(portFmt->eColorFormat);
3137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
313857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      DEBUG_PRINT_HIGH("Set_parameter: OMX_IndexParamVideoPortFormat: "
313957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          "nPortIndex (%d), nIndex (%d), eCompressionFormat (0x%x), "
314057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          "eColorFormat (0x%x), xFramerate (0x%x)", (int)portFmt->nPortIndex,
314157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          (int)portFmt->nIndex, (int)portFmt->eCompressionFormat,
314257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          (int)portFmt->eColorFormat, (int)portFmt->xFramerate);
3143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexPortDefn:
3147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
3149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
3150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
3151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            portFmt->nFramePackingFormat);
3152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Input port */
3154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (portFmt->nPortIndex == 0)
3155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
3157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(secure_mode) {
3159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                arbitrary_bytes = false;
3160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                eRet = OMX_ErrorUnsupportedSetting;
3162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              } else {
3163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               arbitrary_bytes = true;
3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes enabled");
3165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if (portFmt->nFramePackingFormat ==
3168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
3169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               arbitrary_bytes = false;
3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes disabled");
3172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
3174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n",
3176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    portFmt->nFramePackingFormat);
3177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                eRet = OMX_ErrorUnsupportedSetting;
3178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
3181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
3184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_mem_region_smi = OMX_TRUE;
3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
3191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_use_output_pmem = OMX_TRUE;
3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     case OMX_IndexParamStandardComponentRole:
3199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     {
3200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_PARAM_COMPONENTROLETYPE *comp_role;
3201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
3202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
3203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       comp_role->cRole);
3204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if((m_state == OMX_StateLoaded)&&
3206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
3207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           DEBUG_PRINT_LOW("Set Parameter called in valid state");
3209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
3211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             return OMX_ErrorIncorrectStateOperation;
3214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
3219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
3221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
3231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
3233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet = OMX_ErrorUnsupportedSetting;
3238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
3243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet =OMX_ErrorUnsupportedSetting;
3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
3255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorUnsupportedSetting;
3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
3266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  )
3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
3273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
3275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
3283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
3284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    )
3285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
3287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
3289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              else
3291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
3292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
3293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  eRet =OMX_ErrorUnsupportedSetting;
3294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
3295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
3297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
3299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               eRet = OMX_ErrorInvalidComponentName;
3300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     }
3303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_IndexParamPriorityMgmt:
3305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(m_state != OMX_StateLoaded)
3307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
3308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
3309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               return OMX_ErrorIncorrectStateOperation;
3310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
3311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
3312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
3313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              priorityMgmtype->nGroupID);
3314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
3316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             priorityMgmtype->nGroupPriority);
3317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
3319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
3322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamCompBufferSupplier:
3325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
3327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
3328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bufferSupplierType->eBufferSupplier);
3329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
3330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
3331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             else
3333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             eRet = OMX_ErrorBadPortIndex;
3335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoAvc:
3340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
3342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoH263:
3346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
3348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case OMX_IndexParamVideoMpeg4:
3352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
3353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
3354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    paramIndex);
3355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              break;
3356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
3357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_IndexParamVideoMpeg2:
3358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
3360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    paramIndex);
3361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       case OMX_QcomIndexParamVideoDecoderPictureOrder:
3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
3367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
3368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
3369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pictureOrder->eOutputPictureOrder);
3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
3371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DISPLAY;
3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
3373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pic_order = VDEC_ORDER_DECODE;
3374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  time_stamp_dts.set_timestamp_reorder_mode(false);
3375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
3377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorBadParameter;
3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (drv_ctx.idr_only_decoding)
3380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (pictureOrder->eOutputPictureOrder != QOMX_VIDEO_DECODE_ORDER)
3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_HIGH("only decode order is supported for thumbnail mode");
3384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      eRet = OMX_ErrorBadParameter;
3385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
3386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
3389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  drv_ctx.picture_order = pic_order;
3391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ioctl_msg.in = &drv_ctx.picture_order;
3392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ioctl_msg.out = NULL;
3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (void*)&ioctl_msg) < 0)
3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  {
3396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      DEBUG_PRINT_ERROR("\n Set picture order failed");
3397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      eRet = OMX_ErrorUnsupportedSetting;
3398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  }
3399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
3401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamConcealMBMapExtraData:
3403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
3405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  ((QOMX_ENABLETYPE *)paramData)->bEnable);
3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ((QOMX_ENABLETYPE *)paramData)->bEnable);
3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       break;
3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamInterlaceExtraData:
3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamH264TimeInfo:
3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              ((QOMX_ENABLETYPE *)paramData)->bEnable);
3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n secure mode setting not supported");
3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoDivx:
3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((divXType) && (divXType->eFormat == QOMX_VIDEO_DIVXFormat311)) {
3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: DivX 3.11 not supported in 7x30 core.");
3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexPlatformPvt:
3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorUnsupportedSetting;
3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_out_pvt_entry_pmem = OMX_TRUE;
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_use_output_pmem = OMX_TRUE;
3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.idr_only_decoding = 1;
3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          int rc = ioctl(drv_ctx.video_driver_fd,
3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      VDEC_IOCTL_SET_IDR_ONLY_DECODING);
3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(rc < 0) {
3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = OMX_ErrorHardware;
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (eRet == OMX_ErrorNone)
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set decode order for thumbnail mode");
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.picture_order = VDEC_ORDER_DECODE;
3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ioctl_msg.in = &drv_ctx.picture_order;
3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              ioctl_msg.out = NULL;
3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (void*)&ioctl_msg) < 0)
3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("\n Set picture order failed");
3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorUnsupportedSetting;
3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamIndexExtraDataType:
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->bEnabled == OMX_TRUE) &&
3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (extradataIndexType->nPortIndex == 1))
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              // Set smooth streaming parameter
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              int rc = ioctl(drv_ctx.video_driver_fd,
3513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            VDEC_IOCTL_SET_CONT_ON_RECONFIG);
3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(rc < 0) {
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  eRet = OMX_ErrorHardware;
3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* Need to allow following two set_parameters even in Idle
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * state. This is ANDROID architecture which is not in sync
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * with openmax standard. */
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(enableNativeBuffers) {
3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_enable_android_native_buffers = enableNativeBuffers->enable;
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = use_android_native_buffer(hComp, paramData);
3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamEnableTimeStampReorder:
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) {
3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE) {
3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              frm_int =0;
3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              time_stamp_dts.set_timestamp_reorder_mode(true);
3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            time_stamp_dts.set_timestamp_reorder_mode(false);
3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          time_stamp_dts.set_timestamp_reorder_mode(false);
3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (reorder->bEnable == OMX_TRUE)
3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    default:
3561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
3563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorUnsupportedIndex;
3564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
3567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3570e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetConfig
3572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3573e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Get Config Method implementation.
3575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3576e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3579e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
3581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3583e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
3584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_INDEXTYPE configIndex,
3585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_INOUT OMX_PTR     configData)
3586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_state == OMX_StateInvalid)
3590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     return OMX_ErrorInvalidState;
3593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch (configIndex)
3596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexConfigInterlaced:
3598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
3600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
3601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (configFmt->nPortIndex == 1)
3602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (configFmt->nIndex == 0)
3604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
3606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (configFmt->nIndex == 1)
3608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType =
3610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
3611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (configFmt->nIndex == 2)
3613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          configFmt->eInterlaceType =
3615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
3616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
3618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
3620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            " NoMore Interlaced formats\n");
3621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = OMX_ErrorNoMore;
3622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
3626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
3628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        (int)configFmt->nPortIndex);
3629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
3630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
3634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
3637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
3638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
3639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (void)(ioctl(drv_ctx.video_driver_fd,
3640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
3641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
3642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_QcomIndexConfigVideoFramePackingArrangement:
3644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
3646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
3648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
3649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_pack_data(configFmt);
3650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
3652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
3654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_QcomIndexParamFrameInfoExtraData:
3658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_QCOM_EXTRADATA_FRAMEINFO *extradata =
3660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_QCOM_EXTRADATA_FRAMEINFO *) configData;
3661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_extradata == NULL){
3663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("get_config: m_extradata not set. "
3664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            "Aspect Ratio information missing!!");
3665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        extradata->aspectRatio.aspectRatioX =
3668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_extradata->aspectRatio.aspectRatioX;
3669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         extradata->aspectRatio.aspectRatioY =
3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_extradata->aspectRatio.aspectRatioY;
3671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
3673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    default:
3676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
3678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadParameter;
3679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
3684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3687e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SetConfig
3689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3690e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Set Config method implementation
3692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3693e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3696e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if successful.
3698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3699e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
3700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_INDEXTYPE configIndex,
3701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_IN OMX_PTR        configData)
3702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
3704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
3706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
3707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
3710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_VIDEO_CONFIG_NALSIZE *pNal;
3711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Set Config Called");
3713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_state == OMX_StateExecuting)
3715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
3717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     return ret;
3718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (configIndex == OMX_IndexVendorVideoExtraData)
3721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
3723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
3724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
3725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
3727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U32 extra_size;
3728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Parsing done here for the AVC atom is definitely not generic
3729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Currently this piece of code is working, but certainly
3730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // not tested with all .mp4 files.
3731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Incase of failure, we might need to revisit this
3732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // for a generic piece of code.
3733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Retrieve size of NAL length field
3735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // byte #4 contains the size of NAL lenght field
3736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      nal_length = (config->pData[4] & 0x03) + 1;
3737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      extra_size = 0;
3739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (nal_length > 2)
3740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
3742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        extra_size = (nal_length - 2) * 2;
3743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // SPS starts from byte #6
3746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
3747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 *pDestBuf;
3748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nPortIndex = config->nPortIndex;
3749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // minus 6 --> SPS starts from byte #6
3751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // minus 1 --> picture param set byte to be ignored from avcatom
3752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
3753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
3754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U32 len;
3755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_U8 index = 0;
3756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // case where SPS+PPS is sent as part of set_config
3757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pDestBuf = m_vendor_config.pData;
3758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
3760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.nPortIndex,
3761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.nDataSize,
3762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           m_vendor_config.pData);
3763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      while (index < 2)
3764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        uint8 *psize;
3766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = *pSrcBuf;
3767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = len << 8;
3768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len |= *(pSrcBuf + 1);
3769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psize = (uint8 *) & len;
3770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
3771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        for (int i = 0; i < nal_length; i++)
3772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pDestBuf[i] = psize[nal_length - 1 - i];
3774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //memcpy(pDestBuf,pSrcBuf,(len+2));
3776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pDestBuf += len + nal_length;
3777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pSrcBuf += len + 2;
3778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        index++;
3779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pSrcBuf++;   // skip picture param set
3780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        len = 0;
3781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
3784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
3785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nPortIndex = config->nPortIndex;
3787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.nDataSize = config->nDataSize;
3788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
3789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
3790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
3792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(m_vendor_config.pData)
3794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            free(m_vendor_config.pData);
3796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData = NULL;
3797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = 0;
3798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (((*((OMX_U32 *) config->pData)) &
3801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             VC1_SP_MP_START_CODE_MASK) ==
3802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             VC1_SP_MP_START_CODE)
3803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
3805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = config->nDataSize;
3807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData =
3808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (OMX_U8 *) malloc(config->nDataSize);
3809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData, config->pData,
3810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   config->nDataSize);
3811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_SP_MP_RCV;
3812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
3814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
3816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize = config->nDataSize;
3818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData =
3819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                (OMX_U8 *) malloc((config->nDataSize));
3820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData, config->pData,
3821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   config->nDataSize);
3822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_AP;
3823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if ((config->nDataSize == VC1_STRUCT_C_LEN))
3825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
3827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nPortIndex = config->nPortIndex;
3828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.nDataSize  = config->nDataSize;
3829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
3830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
3831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_vc1_profile = VC1_SP_MP_RCV;
3832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
3834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
3836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return ret;
3839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if (configIndex == OMX_IndexConfigVideoNalSize)
3841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
3844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nal_length = pNal->nNaluBytes;
3845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_frame_parser.init_nal_length(nal_length);
3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
3847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return ret;
3848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
3851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3854e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetExtensionIndex
3856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3857e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX GetExtensionIndex method implementaion.  <TBD>
3859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3860e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3863e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
3865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3867e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
3868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_IN OMX_STRING      paramName,
3869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_OUT OMX_INDEXTYPE* indexType)
3870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
3872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
3874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
3875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
3891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
3893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
3894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
3901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
3902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3908e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::GetState
3910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3911e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns the state information back to the caller.<TBD>
3913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3914e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
3916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3917e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Error None if everything is successful.
3919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3920e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
3921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_OUT OMX_STATETYPE* state)
3922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  *state = m_state;
3924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
3925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
3926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3929e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentTunnelRequest
3931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3932e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Component Tunnel Request method implementation. <TBD>
3934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3935e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
3937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3938e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
3940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3942e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
3943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_U32                        port,
3944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_HANDLETYPE        peerComponent,
3945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_IN OMX_U32                    peerPort,
3946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                     OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
3949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
3950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
3953e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
3954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::UseOutputBuffer
3955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3956e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
3957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper function for Use buffer in the input pin
3958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3959e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
3960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
3961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3962e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
3963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
3964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
3966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
3967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
3968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
3969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
3970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
3971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
3972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
3973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
3975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
3976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned                         i= 0; // Temporary counter
3977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
3978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
3979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PTR privateAppData = NULL;
3980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
3981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  private_handle_t *handle = NULL;
3982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buff = buffer;
3984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr) {
3986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
3987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_output_headers();
3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
3990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //allocate H264_mv_buffer
3992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = vdec_alloc_h264_mv();
3993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eRet) {
3994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
3995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(BITMASK_ABSENT(&m_out_bm_count,i))
4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i >= drv_ctx.op_buf.actualcount) {
4012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone) {
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
40183d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if (m_use_android_native_buffers) {
40193d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
40203d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            sp<android_native_buffer_t> nBuf = params->nativeBuffer;
40213d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            handle = (private_handle_t *)nBuf->handle;
40223d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            privateAppData = params->pAppPrivate;
40233d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        } else {
40243d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            handle = (private_handle_t *)buff;
40253d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            privateAppData = appData;
4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
40273d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
40283d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
40293d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
40303d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                              " expected %u, got %lu",
40313d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                              drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
40323d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            return OMX_ErrorBadParameter;
4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
40343d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
40353d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        if (!m_use_android_native_buffers) {
40363d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            if (!secure_mode) {
40373d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                buff =  (OMX_U8*)mmap(0, handle->size,
40383d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                                      PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
40393d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                if (buff == MAP_FAILED) {
40403d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                  DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
40413d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                  return OMX_ErrorInsufficientResources;
40423d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George                }
40433d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George            }
40443d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George        }
40453d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George
4046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_ICS_)
4047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        native_buffer[i].nativehandle = handle;
4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!handle) {
4050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
4052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else
4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!ouput_egl_buffers && !m_use_output_pmem) {
4062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
4065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
4066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                &drv_ctx.op_buf_ion_info[i].fd_ion_data,CACHED);
4067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
4072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          open (MEM_DEVICE,O_RDWR);
4075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
4077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
4081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].pmem_fd = \
4083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            open (MEM_DEVICE,O_RDWR);
4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size,
4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.alignment))
4092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode) {
4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].bufferaddr =
4100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              PROT_READ|PROT_WRITE, MAP_SHARED,
4102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
4104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
4105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return OMX_ErrorInsufficientResources;
4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = 0;
4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
4115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
4117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (!appData || !bytes )
4119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n Invalid appData or bytes");
4121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
4122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if(!secure_mode && !buffer)
4125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
4127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorBadParameter;
4128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
4132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
4133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
4134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!pmem_list->entryList || !pmem_list->entryList->entry ||
4135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            !pmem_list->nEntries ||
4136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
4137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
4138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
4139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pmem_list->entryList->entry;
4142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
4143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          pmem_info->pmem_fd);
4144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
4145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
4146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
4147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].mmaped_size =
4148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
4149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        privateAppData = appData;
4150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
4152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
4153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     *bufferHdr = (m_out_mem_ptr + i );
4155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(secure_mode)
4156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
4157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             sizeof (vdec_bufferpayload));
4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ioctl_msg.in  = &setbuffers;
4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ioctl_msg.out = NULL;
4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          &ioctl_msg) < 0)
4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n Set output buffer failed");
4170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return OMX_ErrorInsufficientResources;
4171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     // found an empty buffer at i
4173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
4174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (m_enable_android_native_buffers) {
4175edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
4176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     } else {
4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (*bufferHdr)->pBuffer = buff;
4179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (*bufferHdr)->pAppPrivate = privateAppData;
4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     BITMASK_SET(&m_out_bm_count,i);
4182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4187e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_vdec::use_input_heap_buffers
4189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4190e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Use Buffer Heap allocation method implementation.
4192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4193e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  <TBD>.
4195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4196e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX Error None , if everything successful.
4198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
4201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
4206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
4207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
4209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr)
4211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
4214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_phdr_pmem_ptr)
4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               drv_ctx.ip_buf.actualcount);
4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficent memory");
4221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
4224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = true;
4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
4234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL))
4236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_in_alloc_cnt++;
4241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("All i/p buffers have been set!");
4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
4246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4251e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::UseBuffer
4253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4254e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Use Buffer method implementation.
4256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4257e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
4259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4260e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None , if everything successful.
4262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4264e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::use_buffer(
4265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes,
4270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U8*                   buffer)
4271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE error = OMX_ErrorNone;
4273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_setbuffer_cmd setbuffers;
4274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (bufferHdr == NULL || bytes == 0)
4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("bad param 0x%p %ld",bufferHdr, bytes);
4279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode && buffer == NULL) {
4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("bad param 0x%p",buffer);
4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state == OMX_StateInvalid)
4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
4290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInvalidState;
4291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == OMX_CORE_INPUT_PORT_INDEX)
4293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
4295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
4296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
4297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error = OMX_ErrorBadPortIndex;
4300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
4302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(error == OMX_ErrorNone)
4303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
4305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Send the callback now
4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandStateSet,OMX_StateIdle,
4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_EVENT);
4310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
4312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
4313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
4315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_CORE_INPUT_PORT_INDEX,
4317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_COMPONENT_GENERATE_EVENT);
4318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
4320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
4321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(OMX_CommandPortEnable,
4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_CORE_OUTPUT_PORT_INDEX,
4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 OMX_COMPONENT_GENERATE_EVENT);
4326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return error;
4329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
4332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
4333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
4335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_heap_ptr[bufferindex].pBuffer)
4337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free(m_inp_heap_ptr[bufferindex].pBuffer);
4338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_inp_heap_ptr[bufferindex].pBuffer = NULL;
4339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (pmem_bufferHdr)
4341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer(pmem_bufferHdr);
4342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
4343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4345e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int index = 0;
4348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
4349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  index = bufferHdr - m_inp_mem_ptr;
4354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
4357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
4359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
4360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       struct vdec_setbuffer_cmd setbuffers;
4363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
4365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          sizeof (vdec_bufferpayload));
4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.in  = &setbuffers;
4367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ioctl_msg.out = NULL;
4368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       int ioctl_r = ioctl (drv_ctx.video_driver_fd,
4369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
4370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       if (ioctl_r < 0)
4371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       {
4372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
4373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
4374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (!secure_mode) {
4375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
4376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].mmaped_size,
4379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
4380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.ptr_inputbuffer[index].mmaped_size);
4382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
4384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
4385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
4387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_desc_buffer_ptr[index].buf_addr);
4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].buf_addr = NULL;
4389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_desc_buffer_ptr[index].desc_data_size = 0;
4390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
4398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4400e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned int index = 0;
4403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL || m_out_mem_ptr == NULL)
4405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nfree_output_buffer ERROR");
4407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  index = bufferHdr - m_out_mem_ptr;
4411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
4412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index < drv_ctx.op_buf.actualcount
4414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      && drv_ctx.ptr_outputbuffer)
4415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
4417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_outputbuffer[index].bufferaddr);
4418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct vdec_setbuffer_cmd setbuffers;
4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
4422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
4423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        sizeof (vdec_bufferpayload));
4424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
4425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
4426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\nRelease the Output Buffer");
4427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
4428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          &ioctl_msg) < 0)
4429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
4430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_enable_android_native_buffers) {
4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
4434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(!secure_mode) {
4435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
4437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
4441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
4444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if(!secure_mode) {
4445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].pmem_fd);
4447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].mmaped_size,
4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].bufferaddr);
4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr,
4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            drv_ctx.ptr_outputbuffer[index].mmaped_size);
4452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
4453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_ion_memory(&drv_ctx.op_buf_ion_info[index]);
4455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close (drv_ctx.ptr_outputbuffer[index].pmem_fd);
4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
4458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_heap_ptr[index].video_heap_ptr = NULL;
4460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_heap_count = m_heap_count - 1;
4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (m_heap_count == 0)
4462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    free(m_heap_ptr);
4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    m_heap_ptr = NULL;
4465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
4468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
4470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
4475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    vdec_dealloc_h264_mv();
4476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
4477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
4480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4483e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
4484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_BUFFERHEADERTYPE **bufferHdr,
4485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32              port,
4486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_PTR              appData,
4487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32              bytes)
4488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *input = NULL;
4490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char *buf_addr = NULL;
4491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned   i = 0;
4493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /* Sanity Check*/
4495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (bufferHdr == NULL)
4496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_inp_heap_ptr == NULL)
4501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
4507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
4508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_inp_heap_ptr == NULL)
4510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
4512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Find a Free index*/
4517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
4520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.ip_buf.actualcount)
4527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
4529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (buf_addr == NULL)
4531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *bufferHdr = (m_inp_heap_ptr + i);
4536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input = *bufferHdr;
4537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    BITMASK_SET(&m_heap_inp_bm_count,i);
4538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pBuffer           = (OMX_U8 *)buf_addr;
4540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nVersion.nVersion = OMX_SPEC_VERSION;
4542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pAppPrivate       = appData;
4544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
4546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
4547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] );
4548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Add the Buffers to freeq*/
4549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL))
4550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
4552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
4556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
4558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4566e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateInputBuffer
4568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4569e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper function for allocate buffer in the input pin
4571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4572e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
4574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4575e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
4577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4579e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
4580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes)
4585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_setbuffer_cmd setbuffers;
4589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *input = NULL;
4590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned   i = 0;
4592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned char *buf_addr = NULL;
4593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int pmem_fd = -1;
4594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bytes != drv_ctx.ip_buf.buffer_size)
4596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
4598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes, drv_ctx.ip_buf.buffer_size);
4599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //return OMX_ErrorBadParameter;
4600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(!m_inp_mem_ptr)
4603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
4605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.actualcount,
4606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.buffer_size);
4607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
4609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (m_inp_mem_ptr == NULL)
4612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
4617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer == NULL)
4620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
4625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info == NULL)
4628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
4634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
4643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_inp_bm_count,i))
4645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
4647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i < drv_ctx.ip_buf.actualcount)
4652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Allocate input Buffer");
4654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
4658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
4659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		    &drv_ctx.ip_buf_ion_info[i].fd_ion_data,CACHED);
4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
4661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
4663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pmem_fd < 0)
4668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pmem_fd == 0)
4674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
4676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pmem_fd < 0)
4678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
4680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInsufficientResources;
4681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ip_buf.alignment))
4686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
4688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      close(pmem_fd);
4689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buf_addr = (unsigned char *)mmap(NULL,
4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.ip_buf.buffer_size,
4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buf_addr == MAP_FAILED)
4698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            close(pmem_fd);
4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
4704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_inp_mem_ptr + i);
4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
4712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_inputbuffer [i].offset = 0;
4716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer [i],
4719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            sizeof (vdec_bufferpayload));
4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
4722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
4724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         &ioctl_msg) < 0)
4725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Set Buffers Failed");
4727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInsufficientResources;
4728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input = *bufferHdr;
4731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    BITMASK_SET(&m_inp_bm_count,i);
4732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         input->pBuffer           = (OMX_U8 *)buf_addr;
4737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
4738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nVersion.nVersion = OMX_SPEC_VERSION;
4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
4740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->pAppPrivate       = appData;
4741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.disable_dmx)
4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = allocate_desc_buffer(i);
4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
4750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
4752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorInsufficientResources;
4753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
4755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
4756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
4759e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
4760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateOutputBuffer
4761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4762e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
4763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Helper fn for AllocateBuffer in the output pin
4764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4765e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
4766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
4767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4768e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
4769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went well.
4770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
4772e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
4773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE            hComp,
4774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
4775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   port,
4776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_PTR                   appData,
4777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_U32                   bytes)
4778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
4779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
4780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
4781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned                         i= 0; // Temporary counter
4782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
4783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_setbuffer_cmd setbuffers;
4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_device_fd =-1;
4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_allocation_data ion_alloc_data;
4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ion_fd_data fd_ion_data;
4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nBufHdrSize        = 0;
4791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPlatformEntrySize = 0;
4792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPlatformListSize  = 0;
4793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int nPMEMInfoSize = 0;
4794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int pmem_fd = -1;
4795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned char *pmem_baseaddress = NULL;
4796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
4798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_mem_ptr)
4802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
4804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount,
4805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size);
4806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
4811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
4812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
4814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
4815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
4816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
4817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
4818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
4819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
4821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         sizeof(OMX_BUFFERHEADERTYPE),
4822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         nPMEMInfoSize,
4823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         nPlatformListSize);
4824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
4825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         drv_ctx.op_buf.actualcount);
4826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
4828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Alloc mem for platform specific info
4829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char *pPtr=NULL;
4830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
4831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     nPMEMInfoSize,1);
4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
4836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
4840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),
4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr = (struct vidc_heap *)\
4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       calloc (sizeof(struct vidc_heap),
4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer
4851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   && m_heap_ptr
4853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   )
4855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_outputbuffer[0].mmaped_size =
4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (drv_ctx.op_buf.buffer_size *
4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         drv_ctx.op_buf.actualcount);
4859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bufHdr          =  m_out_mem_ptr;
4860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
4861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
4862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        (((char *) m_platform_list)  + nPlatformListSize);
4863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
4864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        (((char *) m_platform_entry) + nPlatformEntrySize);
4865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPlatformList   = m_platform_list;
4866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPlatformEntry  = m_platform_entry;
4867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pPMEMInfo       = m_pmem_info;
4868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
4870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // Settting the entire storage nicely
4872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
4873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
4875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
4877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
4878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Set the values when we determine the right HxW param
4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
4880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nFilledLen         = 0;
4881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
4882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
4883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Platform specific PMEM Information
4884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Initialize the Platform Entry
4885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
4886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
4887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry->entry      = pPMEMInfo;
4888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Initialize the Platform List
4889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList->nEntries    = 1;
4890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList->entryList   = pPlatformEntry;
4891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Keep pBuffer NULL till vdec is opened
4892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->pBuffer            = NULL;
4893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
4895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPMEMInfo->pmem_fd = 0;
4896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr->pPlatformPrivate = pPlatformList;
4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Create a mapping between buffers*/
4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *)\
4904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
4906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_heap_ptr[i].video_heap_ptr = NULL;
4907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Move the buffer and buffer header pointers
4909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bufHdr++;
4910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPMEMInfo++;
4911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformEntry++;
4912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPlatformList++;
4913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(eRet == OMX_ErrorNone && drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        //Allocate the h264_mv_buffer
4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = vdec_alloc_h264_mv();
4919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(eRet) {
4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
4924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
4927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
4929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        m_out_mem_ptr, pPtr);
4930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(m_out_mem_ptr)
4931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_out_mem_ptr);
4933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_out_mem_ptr = NULL;
4934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(pPtr)
4936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(pPtr);
4938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pPtr = NULL;
4939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
4941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
4944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
4946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
4947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
4948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
4949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
4950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
4952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
4953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
4954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet =  OMX_ErrorInsufficientResources;
4958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for (i=0; i< drv_ctx.op_buf.actualcount; i++)
4962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(BITMASK_ABSENT(&m_out_bm_count,i))
4964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
4965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Found a Free Output Buffer Index %d",i);
4966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
4967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
4968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
4969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (i < drv_ctx.op_buf.actualcount)
4971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
4972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate Output Buffer");
4973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
4975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
4976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
4978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.op_buf_ion_info[i].fd_ion_data, CACHED);
4979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
4980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
4981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     }
4982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
4983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
4984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = open (MEM_DEVICE,O_RDWR);
4985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd < 0)
4987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
4989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf.buffer_size);
4990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
4991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pmem_fd == 0)
4994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
4995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pmem_fd = open (MEM_DEVICE,O_RDWR);
4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pmem_fd < 0)
4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
4999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
5000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           drv_ctx.op_buf.buffer_size);
5001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return OMX_ErrorInsufficientResources;
5002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size,
5006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.alignment))
5007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
5009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(pmem_fd);
5010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!secure_mode) {
5014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_baseaddress = (unsigned char *)mmap(NULL,
5015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           drv_ctx.op_buf.buffer_size,
5016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
5017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pmem_baseaddress == MAP_FAILED)
5019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.op_buf.buffer_size);
5022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          close(pmem_fd);
5023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
5024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
5025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
5027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *bufferHdr = (m_out_mem_ptr + i);
5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (secure_mode)
5032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer [i].bufferaddr = *bufferHdr;
5033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer [i].bufferaddr = pmem_baseaddress;
5035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].pmem_fd = pmem_fd;
5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].buffer_len = drv_ctx.op_buf.buffer_size;
5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].mmaped_size = drv_ctx.op_buf.buffer_size;
5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer [i].offset = 0;
5040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev #ifdef USE_ION
5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr[i].video_heap_ptr = new VideoHeap (drv_ctx.op_buf_ion_info[i].ion_device_fd,
5044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                drv_ctx.op_buf.buffer_size,
5045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_baseaddress,
5046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ion_alloc_data.handle,
5047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_fd);
5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_count = m_heap_count + 1;
504940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#else
5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_heap_ptr[i].video_heap_ptr = new VideoHeap (pmem_fd,
5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                drv_ctx.op_buf.buffer_size,
5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                pmem_baseaddress);
5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
5057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr[i].video_heap_ptr.get ();
5059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
5060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd ;
5061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
5063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer [i],
5064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            sizeof (vdec_bufferpayload));
5065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in  = &setbuffers;
5066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         &ioctl_msg) < 0)
5071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Set output buffer failed");
5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
5074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // found an empty buffer at i
5077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
5078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
5079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (*bufferHdr)->pAppPrivate = appData;
5080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    BITMASK_SET(&m_out_bm_count,i);
5081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Output Buffer Index not found");
5086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
5087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
5089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// AllocateBuffer  -- API Call
5093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5094e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateBuffer
5096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5097e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Returns zero if all the buffers released..
5099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5100e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5103e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5107e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
5108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
5109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_U32                        port,
5110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_PTR                     appData,
5111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_U32                       bytes)
5112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned i = 0;
5114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
5115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
5117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateInvalid)
5118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
5120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorInvalidState;
5121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(port == OMX_CORE_INPUT_PORT_INDEX)
5124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (arbitrary_bytes)
5126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
5128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
5130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
5131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
5132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
5133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
513640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
513740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                                                           appData,bytes);
5138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
5142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorBadPortIndex;
5143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
5145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(eRet == OMX_ErrorNone)
5146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(allocate_done()){
5148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
5149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                // Send the callback now
5151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
5152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandStateSet,OMX_StateIdle,
5153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_COMPONENT_GENERATE_EVENT);
5154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
5157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
5159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
5161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             post_event(OMX_CommandPortEnable,
5162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_CORE_INPUT_PORT_INDEX,
5163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        OMX_COMPONENT_GENERATE_EVENT);
5164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
5165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
5167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
5169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
5171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandPortEnable,
5172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_CORE_OUTPUT_PORT_INDEX,
5173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_COMPONENT_GENERATE_EVENT);
5174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
5178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return eRet;
5179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Free Buffer - API call
5182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5183e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::FreeBuffer
5185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5186e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5188e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5191e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5195e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_U32                 port,
5197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE eRet = OMX_ErrorNone;
5200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int nPortIndex;
5201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("In for decoder free_buffer \n");
5203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_state == OMX_StateIdle &&
5205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
5208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
5210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
5211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
5213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
5215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
5217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,
5218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_ErrorPortUnpopulated,
5219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
5220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
5222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (m_state != OMX_StateInvalid)
5224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
5226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        post_event(OMX_EventError,
5227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_ErrorPortUnpopulated,
5228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   OMX_COMPONENT_GENERATE_EVENT);
5229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(port == OMX_CORE_INPUT_PORT_INDEX)
5232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /*Check if arbitrary bytes*/
5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!arbitrary_bytes && !input_use_buffer)
5235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        nPortIndex = buffer - m_inp_mem_ptr;
5236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
5237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nPortIndex = buffer - m_inp_heap_ptr;
5238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
5240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.ip_buf.actualcount)
5241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // Clear the bit associated with it.
5243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
5244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
5245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (input_use_buffer == true)
5246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
5247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
5249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(m_phdr_pmem_ptr)
5250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
5251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else
5253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (arbitrary_bytes)
5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
5256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(m_phdr_pmem_ptr)
5257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
5258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                free_input_buffer(nPortIndex,NULL);
5260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
5262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_input_buffer(buffer);
5263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_inp_bPopulated = OMX_FALSE;
5265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         /*Free the Buffer Header*/
5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (release_input_done())
5267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
5268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer_header();
5270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
5271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
5273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
5275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            eRet = OMX_ErrorBadPortIndex;
5276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
5279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           && release_input_done())
5280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
5283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            post_event(OMX_CommandPortDisable,
5284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       OMX_CORE_INPUT_PORT_INDEX,
5285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       OMX_COMPONENT_GENERATE_EVENT);
5286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
5289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // check if the buffer is valid
529140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
5292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(nPortIndex < drv_ctx.op_buf.actualcount)
5293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
5295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Clear the bit associated with it.
5296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
5297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_out_bPopulated = OMX_FALSE;
529840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            client_buffers.free_output_buffer (buffer);
5299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (release_output_done())
5301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
5302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              free_output_buffer_header();
5303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
5304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
5306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
5308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            eRet = OMX_ErrorBadPortIndex;
5309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
5311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           && release_output_done())
5312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
5314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
5316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
5317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (m_enable_android_native_buffers)
5319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
5320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
5321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
5323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                post_event(OMX_CommandPortDisable,
5326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_CORE_OUTPUT_PORT_INDEX,
5327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_COMPONENT_GENERATE_EVENT);
5328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        eRet = OMX_ErrorBadPortIndex;
5333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((eRet == OMX_ErrorNone) &&
5335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
5336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(release_done())
5338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            // Send the callback now
5340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
5341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            post_event(OMX_CommandStateSet, OMX_StateLoaded,
5342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_COMPONENT_GENERATE_EVENT);
5343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return eRet;
5346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5350e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::EmptyThisBuffer
5352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5353e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This routine is used to push the encoded video frames to
5355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  the video decoder.
5356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5357e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5360e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went successful.
5362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5364e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
5365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret1 = OMX_ErrorNone;
5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_config_flag = true;
5373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
5374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_config_flag = false;
5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
5381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
5383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
5384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL)
5387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
5389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_inp_bEnabled)
5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex);
5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(iDivXDrmDecrypt)
5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
5408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(drmErr != OMX_ErrorNone) {
5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // this error can be ignored
5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
5411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (perf_flag)
5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!latency)
5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.stop();
5418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      latency = dec_time.processing_time_us();
5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dec_time.start();
5420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (arbitrary_bytes)
5425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    nBufferIndex = buffer - m_inp_heap_ptr;
5427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
5429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (input_use_buffer == true)
5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_heap_ptr;
5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       buffer = &m_inp_mem_ptr[nBufferIndex];
5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else{
5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       nBufferIndex = buffer - m_inp_mem_ptr;
5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
5443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nBufferIndex > drv_ctx.ip_buf.actualcount )
5446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
5448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
5453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (arbitrary_bytes)
5454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned)hComp,(unsigned)buffer,
5456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
5457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
5459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(buffer->nTimeStamp);
5462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
5463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5468e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::empty_this_buffer_proxy
5470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5471e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This routine is used to push the encoded video frames to
5473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  the video decoder.
5474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5475e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5478e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything went successful.
5480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5482e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
5483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int push_cnt = 0,i=0;
5486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned nPortIndex = 0;
5487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
5488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_input_frameinfo frameinfo;
5489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_bufferpayload *temp_buffer;
5490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg;
5491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_seqheader seq_header;
5492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool port_setting_changed = true;
5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool not_coded_vop = false;
5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Should we generate a Aync error event*/
5498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL || buffer->pInputPortPrivate == NULL)
5499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
5501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
5505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nPortIndex > drv_ctx.ip_buf.actualcount)
5507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
5509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        nPortIndex);
5510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pending_input_buffers++;
5514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
5517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
5518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer");
5520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EBD);
5522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4StreamType psBits;
5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psBits.numBytes = buffer->nFilledLen;
5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    mp4_headerparser.parseHeader(&psBits);
5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    not_coded_vop = mp4_headerparser.is_notcodec_vop(
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(not_coded_vop) {
5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\n Found Not coded vop len %d frame number %d",
5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             buffer->nFilledLen,frame_count);
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          not_coded_vop = false;
5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          buffer->nFilledLen = 0;
5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(input_flush_progress == true
5545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
5546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     || not_coded_vop
5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     )
5549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
5551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_EBD);
5553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
5557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
5559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
5564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*for use buffer we need to memcpy the data*/
5565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  temp_buffer->buffer_len = buffer->nFilledLen;
5566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (input_use_buffer)
5568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (buffer->nFilledLen <= temp_buffer->buffer_len)
5570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(arbitrary_bytes)
5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
5574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
5576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
5577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
5578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->nFilledLen);
5579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
5584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.bufferaddr = temp_buffer->bufferaddr;
5589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.client_data = (void *) buffer;
5590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.datalen = temp_buffer->buffer_len;
5591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.flags = 0;
5592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.offset = buffer->nOffset;
5593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.pmem_fd = temp_buffer->pmem_fd;
5594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.pmem_offset = temp_buffer->offset;
5595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  frameinfo.timestamp = buffer->nTimeStamp;
5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: dmx enabled");
5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_demux_entries == 0)
5600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extract_demux_addr_offsets(buffer);
5602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
5605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    handle_demux_data(buffer);
5606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
5607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
5608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
5610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_addr = NULL;
5612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.desc_size = 0;
5613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!arbitrary_bytes)
5615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frameinfo.flags |= buffer->nFlags;
5617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_debug_timestamp)
5622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(arbitrary_bytes)
5624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
5629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
5631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.insert_ts(buffer->nTimeStamp);
5632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (inputBufferFile1)
5638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite((const char *)temp_buffer->bufferaddr,
5640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      temp_buffer->buffer_len,1,inputBufferFile1);
5641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
5645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
5653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_scratch.nFilledLen = 0;
5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nal_count = 0;
5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    look_ahead_nal = false;
5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_count = 0;
5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.mutils)
5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_frame_parser.mutils->initialize_frame_checking_environment();
5660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_frame_parser.flush();
5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_ts = LLONG_MAX;
5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_last_au_flags = 0;
5663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_entries = 0;
5665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
5668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &frameinfo;
5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
5670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
5671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            &ioctl_msg) < 0)
5672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Generate an async error and move to invalid state*/
5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy VDEC_IOCTL_DECODE_FRAME failed");
5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!arbitrary_bytes)
5676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Return failed buffer");
5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EBD);
5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else
5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      time_stamp_dts.insert_timestamp(buffer);
5684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
5686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5689e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::FillThisBuffer
5691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5692e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL client uses this method to release the frame buffer
5694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  after displaying them.
5695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5696e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5699e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5703e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
5704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_state == OMX_StateInvalid)
5708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("FTB in Invalid State\n");
5710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorInvalidState;
5711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_out_bEnabled)
5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorIncorrectStateOperation;
5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer == NULL ||
572040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George     ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount))
5721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadPortIndex;
5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
573240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  post_event((unsigned) hComp, (unsigned)buffer,m_fill_output_msg);
5733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5736e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::fill_this_buffer_proxy
5738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5739e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  IL client uses this method to release the frame buffer
5741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  after displaying them.
5742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5743e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5746e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
5748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5750e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
5751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_HANDLETYPE        hComp,
5752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                         OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE nRet = OMX_ErrorNone;
5755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
5756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
5757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_fillbuffer_cmd fillbuffer;
5758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
5759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
5760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
576240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (bufferAdd == NULL || ((buffer - client_buffers.get_il_buf_hdr()) >
5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount) )
5764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
5767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bufferAdd, bufferAdd->pBuffer);
5768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  /*Return back the output buffer to client*/
5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
5770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
5773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
5775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pending_output_buffers++;
577740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
5778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
5779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ptr_respbuffer)
5780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
5782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
5785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
5787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer->nFilledLen = 0;
5788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.FillBufferDone (hComp,m_app_data,buffer);
5789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_output_buffers--;
5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
5791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
5794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          sizeof(struct vdec_bufferpayload));
579540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  fillbuffer.client_data = buffer;
5796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Acquire a write lock on this buffer.
5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle,
5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                  GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
5803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Failed to acquire genlock");
5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen = 0;
5805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_cb.FillBufferDone (hComp,m_app_data,buffer);
5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pending_output_buffers--;
5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[buffer - m_out_mem_ptr].inuse = true;
5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = &fillbuffer;
5815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
5816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,
5817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
5818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
5819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Decoder frame failed");
5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Unlock the buffer
5824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Releasing genlock failed");
5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
5827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[buffer - m_out_mem_ptr].inuse = false;
5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.FillBufferDone (hComp,m_app_data,buffer);
5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_output_buffers--;
5834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
5835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
5836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
5838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5841e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::SetCallbacks
5843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5844e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Set the callbacks.
5846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5847e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
5849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5850e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
5852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5854e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
5855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_CALLBACKTYPE* callbacks,
5856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           OMX_IN OMX_PTR             appData)
5857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_cb       = *callbacks;
5860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
5861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               m_cb.EventHandler,m_cb.FillBufferDone);
5862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  m_app_data =    appData;
5863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNotImplemented;
5864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
5865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
5867e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
5868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentDeInit
5869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5870e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
5871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Destroys the component and release memory allocated to the heap.
5872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5873e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
5874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
5875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5876e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
5877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything successful.
5878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
5880e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
5882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(iDivXDrmDecrypt)
5884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int i = 0;
5890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (OMX_StateLoaded != m_state)
5891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
5893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          m_state);
5894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
5895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
5897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
5899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5901fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secure_mode) {
5902fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      if (unsecureDisplay(qService::IQService::START) < 0) {
5903fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_HIGH("Failed to send message to unsecure display START");
5904fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      }
5905fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
5906fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
5907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if the output buffers have to be cleaned up*/
5908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_out_mem_ptr)
5909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Freeing the Output Memory\n");
5911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i < drv_ctx.op_buf.actualcount; i++ )
5912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          free_output_buffer (&m_out_mem_ptr[i]);
5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_enable_android_native_buffers)
5916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (native_buffer[i].inuse)
5918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
5919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
5920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("Unlocking genlock failed");
5921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
5922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            native_buffer[i].inuse = false;
5923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
5924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
5928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if the input buffers have to be cleaned up*/
5933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_inp_mem_ptr || m_inp_heap_ptr)
5934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("Freeing the Input Memory\n");
5936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for (i=0; i<drv_ctx.ip_buf.actualcount; i++ )
5937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
5938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_inp_mem_ptr)
5939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,&m_inp_mem_ptr[i]);
5940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
5941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_input_buffer (i,NULL);
5942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
5943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
5946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(h264_scratch.pBuffer)
5947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
5953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
5955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	h264_parser = NULL;
5956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_platform_list)
5959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_platform_list);
5961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_platform_list = NULL;
5962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(m_vendor_config.pData)
5964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
5965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(m_vendor_config.pData);
5966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_vendor_config.pData = NULL;
5967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
5968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Reset counters in mesg queues
5970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.m_size=0;
5971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.m_size=0;
5972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.m_size=0;
5973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_ftb_q.m_read = m_ftb_q.m_write =0;
5974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cmd_q.m_read = m_cmd_q.m_write =0;
5975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_etb_q.m_read = m_etb_q.m_write =0;
5976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
5977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_debug_timestamp)
5978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
5979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_timestamp_list.reset_ts_list();
5980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
5983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
5984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
5985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        NULL);
5986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_HIGH("\n Close the driver instance");
5987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
5988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /* get strong count gets the refernce count of the pmem, the count will
5989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * be incremented by our kernal driver and surface flinger, by the time
5990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * we close the pmem, this cound needs to be zero, but there is no way
5991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * for us to know when surface flinger reduces its cound, so we wait
5992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * here in a infinite loop till the count is zero
5993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    */
5994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (m_heap_ptr)
5995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     {
5996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         for (int indx = 0; indx < drv_ctx.op_buf.actualcount; indx++)
5997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_heap_ptr[indx].video_heap_ptr = NULL;
5998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(m_heap_ptr);
5999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_heap_ptr = NULL;
6000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         m_heap_count = 0;
6001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
6002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_
6003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(drv_ctx.video_driver_fd);
6004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
6005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputBufferFile1);
6009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6013fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
6014fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (secure_mode) {
6015fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      if (unsecureDisplay(qService::IQService::END) < 0) {
6016fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_HIGH("Failed to send message to unsecure display STOP");
6017fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George      }
6018fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
6019fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
6020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
6021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6025e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::UseEGLImage
6027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6028e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Use EGL Image method implementation <TBD>.
6030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6031e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
6033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6034e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Not Implemented error.
6036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6038e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
6039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
6040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_U32                        port,
6041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN OMX_PTR                     appData,
6042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_IN void*                      eglImage)
6043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
6049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   EGLint fd = -1, offset = 0,pmemPtr = 0;
6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int fd = -1, offset = 0;
6053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("\n ");
6057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
6059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(m_display_id == NULL) {
6060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
6061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
6064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    eglGetProcAddress("eglQueryImageKHR");
6065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
6066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
6068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
6070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (temp_egl_id != NULL)
6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
6084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.pmem_fd = (OMX_U32) fd;
6087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_info.offset = (OMX_U32) offset;
6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.entry = (void *) &pmem_info;
6089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.entryList = &pmem_entry;
6091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pmem_list.nEntries = 1;
6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ouput_egl_buffers = true;
6093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
6095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_U8 *)pmemPtr)) {
6096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
6097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorInsufficientResources;
6098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
6099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return OMX_ErrorNone;
6100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6103e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ComponentRoleEnum
6105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6106e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Component Role Enum method implementation.
6108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6109e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  <TBD>.
6111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6112e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX Error None if everything is successful.
6114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6115e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
6116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_OUT OMX_U8*        role,
6117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                OMX_IN OMX_U32        index)
6118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE eRet = OMX_ErrorNone;
6120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
6122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
6124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
6126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
6131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
6134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if((0 == index) && role)
6136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
6138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNoMore;
6143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
6146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
6150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n No more roles \n");
6155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
6159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
6160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
6161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          )
6162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
6163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
6164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
6169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
6178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
6182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
6191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
6192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           )
6193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((0 == index) && role)
6195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
6197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
6198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n No more roles \n");
6202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      eRet = OMX_ErrorNoMore;
6203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
6208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    eRet = OMX_ErrorInvalidComponentName;
6209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return eRet;
6211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6217e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateDone
6219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6220e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if entire buffer pool is allocated by IL Client or not.
6222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Need this to move to IDLE state.
6223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6224e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6227e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_done(void)
6232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet_In = false;
6235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet_Out = false;
6236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet_In = allocate_input_done();
6238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bRet_Out = allocate_output_done();
6239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(bRet_In && bRet_Out)
6241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6248e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateInputDone
6250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6251e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if I/P buffer pool is allocated by IL Client or not.
6253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6254e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6257e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_input_done(void)
6262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0;
6265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_inp_mem_ptr == NULL)
6267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return bRet;
6269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_inp_mem_ptr )
6271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;i<drv_ctx.ip_buf.actualcount;i++)
6273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(BITMASK_ABSENT(&m_inp_bm_count,i))
6275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
6277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i == drv_ctx.ip_buf.actualcount)
6281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
6284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
6286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     m_inp_bPopulated = OMX_TRUE;
6288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6292e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::AllocateOutputDone
6294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6295e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if entire O/P buffer pool is allocated by IL Client or not.
6297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6298e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6301e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false.
6303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_output_done(void)
6306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned j=0;
6309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_out_mem_ptr == NULL)
6311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return bRet;
6313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
6316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(;j < drv_ctx.op_buf.actualcount;j++)
6318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(BITMASK_ABSENT(&m_out_bm_count,j))
6320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
6322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(j == drv_ctx.op_buf.actualcount)
6327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
6330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_bEnabled)
6331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_out_bPopulated = OMX_TRUE;
6332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6338e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseDone
6340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6341e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6344e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6347e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_done(void)
6352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(release_input_done())
6356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(release_output_done())
6358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bRet = true;
6360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6367e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseOutputDone
6369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6370e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6373e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6376e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_output_done(void)
6381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0,j=0;
6384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
6386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_out_mem_ptr)
6387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j < drv_ctx.op_buf.actualcount ; j++)
6389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(BITMASK_PRESENT(&m_out_bm_count,j))
6391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
6393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j == drv_ctx.op_buf.actualcount)
6396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_out_bm_count = 0;
6398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_out_bm_count = 0;
6404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ======================================================================
6409e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION
6410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec::ReleaseInputDone
6411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6412e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION
6413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  Checks if IL client has released all the buffers.
6414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6415e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS
6416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  None.
6417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6418e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE
6419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  true/false
6420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */
6422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_input_done(void)
6423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  bool bRet = false;
6425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned i=0,j=0;
6426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
6428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(m_inp_mem_ptr)
6429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(;j<drv_ctx.ip_buf.actualcount;j++)
6431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if( BITMASK_PRESENT(&m_inp_bm_count,j))
6433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
6435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(j==drv_ctx.ip_buf.actualcount)
6438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bRet = true;
6440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bRet = true;
6445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return bRet;
6447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               OMX_BUFFERHEADERTYPE * buffer)
6451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
6453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
6455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (output_flush_progress)
6460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFilledLen = 0;
6463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nTimeStamp = 0;
6464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char value[PROPERTY_VALUE_MAX];
6471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  property_get("vidc.dec.debug.panframedata", value, NULL);
6472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (atoi(value))
6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
6476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n");
6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
6480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
6484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\n");
6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("***************************************************\n");
6489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer, buffer->pBuffer);
6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pending_output_buffers --;
6496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Output EOS has been reached");
6500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!output_flush_progress)
6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
6502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame)
6504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
6506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
6507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame)
6509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen = 0;
6511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
6512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame = NULL;
6513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
6517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
6518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputBufferFile1)
6519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6520edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U32 index = buffer - m_out_mem_ptr;
6521edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
6522edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
6523edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    fwrite (pBuffer,1,buffer->nFilledLen,
6524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  outputBufferFile1);
6525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* For use buffer we need to copy the data */
6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!output_flush_progress)
6530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    time_stamp_dts.get_next_timestamp(buffer,
6532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
6533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ?true:false);
6534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (m_cb.FillBufferDone)
6536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFilledLen > 0)
6538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata)
6540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        handle_extradata(buffer);
6541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (client_extradata & OMX_TIMEINFO_EXTRADATA)
6542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep min timestamp interval to handle corrupted bit stream scenario
6543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        set_frame_rate(buffer->nTimeStamp);
6544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (arbitrary_bytes)
6545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        adjust_timestamp(buffer->nTimeStamp);
6546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (perf_flag)
6548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!proc_frms)
6550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.stop();
6552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          latency = dec_time.processing_time_us() - latency;
6553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
6554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          dec_time.start();
6555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.start();
6556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        proc_frms++;
6558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
6559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
6560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_U64 proc_time = 0;
6561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps_metrics.stop();
6562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_time = fps_metrics.processing_time_us();
6563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
6564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            proc_frms, (float)proc_time / 1e6,
6565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (float)(1e6 * proc_frms) / proc_time);
6566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          proc_frms = 0;
6567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
6570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
6572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (outputExtradataFile)
6573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6575edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U32 index = buffer - m_out_mem_ptr;
6576edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George    OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
6577edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
6578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
6579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *)
6580edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George           ((unsigned)(pBuffer + buffer->nOffset +
6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer->nFilledLen + 3)&(~3));
6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra &&
6583edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George          (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) )
6584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
6586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
6587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == OMX_ExtraDataNone)
6588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
6590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
6592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
6597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = LLONG_MAX;
6598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rst_prev_ts = true;
6599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
6602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
6603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                buffer->pPlatformPrivate)->entryList->entry;
6604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
6605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
6606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_enable_android_native_buffers)
6607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (native_buffer[buffer - m_out_mem_ptr].inuse) {
6609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
6610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Unlocking genlock failed");
6611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
6612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
6614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        native_buffer[buffer - m_out_mem_ptr].inuse = false;
6615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
661940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    OMX_BUFFERHEADERTYPE *il_buffer;
662040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    il_buffer = client_buffers.get_il_buf_hdr(buffer);
662140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (il_buffer)
662240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
662340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else {
662440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
662540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorBadParameter;
662640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
662740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
6628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
6629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
6633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6638e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
6639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                          OMX_BUFFERHEADERTYPE* buffer)
6640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
6643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
6645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       return OMX_ErrorBadParameter;
6646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
6649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer, buffer->pBuffer);
6650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pending_input_buffers--;
6651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (arbitrary_bytes)
6653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame == NULL && input_flush_progress == false)
6655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
6657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = buffer;
6658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nTimeStamp = LLONG_MAX;
6660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        push_input_buffer (hComp);
6661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
6663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
6665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL))
6667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
6668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
6669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
6670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(m_cb.EmptyBufferDone)
6673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen = 0;
6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (input_use_buffer == true){
6676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
6681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint omx_vdec::async_message_process (void *context, void* message)
6685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx_vdec* omx = NULL;
6687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_msginfo *vdec_msg = NULL;
6688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BUFFERHEADERTYPE* omxhdr = NULL;
6689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct vdec_output_frameinfo *output_respbuf = NULL;
6690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (context == NULL || message == NULL)
6692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
6694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return -1;
6695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  vdec_msg = (struct vdec_msginfo *)message;
6697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  omx = reinterpret_cast<omx_vdec*>(context);
6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (omx->m_debug_timestamp)
6702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
6704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         !(omx->output_flush_progress) )
6705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_TICKS expected_ts = 0;
6707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->m_timestamp_list.pop_min_ts(expected_ts);
6708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
6709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
6710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
6712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
6713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
6714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch (vdec_msg->msgcode)
6720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_EVT_HW_ERROR:
6723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_START_DONE:
6728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_START_DONE);
6730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_STOP_DONE:
6733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_STOP_DONE);
6735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_RESUME_DONE:
6738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_RESUME_DONE);
6740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_PAUSE_DONE:
6743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
6745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  break;
6746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
6748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
6750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
6752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event (NULL,vdec_msg->status_code,\
6753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
6754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_INPUT_FLUSHED:
6756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
6757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxhdr = (OMX_BUFFERHEADERTYPE* )\
6759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              vdec_msg->msgdata.input_frame_clientdata;
6760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (omxhdr == NULL ||
6763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
6764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       omxhdr = NULL;
6766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       vdec_msg->status_code = VDEC_S_EFATAL;
6767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     OMX_COMPONENT_GENERATE_EBD);
6771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
6773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int64_t *timestamp;
6774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      timestamp = (int64_t *) malloc(sizeof(int64_t));
6775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (timestamp) {
6776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
6777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             vdec_msg->msgdata.output_frame.time_stamp);
6781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
6783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  case VDEC_MSG_RESP_OUTPUT_FLUSHED:
6784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
6785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxhdr = (OMX_BUFFERHEADERTYPE*)vdec_msg->msgdata.output_frame.client_data;
6786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
6787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      vdec_msg->msgdata.output_frame.pic_type);
6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* update SYNCFRAME flag */
6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omx->eCompressionFormat == OMX_VIDEO_CodingAVC)
6792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* set SYNCFRAME flag if picture type is IDR for h264 */
6794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_IDR)
6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
6796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
6801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* set SYNCFRAME flag if picture type is I_TYPE */
6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_I)
6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
6805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (omxhdr && omxhdr->pOutputPortPrivate &&
6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
6810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
6812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
6814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
6816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
6817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
6818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omxhdr->nFlags = (vdec_msg->msgdata.output_frame.flags);
6819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf = (struct vdec_output_frameinfo *)\
6821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                          omxhdr->pOutputPortPrivate;
6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.bottom =
6823090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.bottom;
6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.left =
6825090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.left;
6826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.right =
6827090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.right;
6828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->framesize.top =
6829090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly          vdec_msg->msgdata.output_frame.framesize.top;
6830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->len = vdec_msg->msgdata.output_frame.len;
6831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
6832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
6833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
6834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
6835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
6836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        output_respbuf->aspect_ratio_info =
6837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           vdec_msg->msgdata.output_frame.aspect_ratio_info;
6838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (omx->output_use_buffer)
6841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ( omxhdr->pBuffer,
6842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (vdec_msg->msgdata.output_frame.bufferaddr +
6843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.offset),
6844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    vdec_msg->msgdata.output_frame.len );
6845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
6847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omxhdr->nFilledLen = 0;
6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
6849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_FBD);
6850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_EOS_DONE);
6854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
6855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      omx->post_event (NULL, vdec_msg->status_code,
6856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
6857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_CONFIG_CHANGED:
6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed");
6860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_PORT_RECONFIG);
6862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
6864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
6865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Port settings changed info");
6866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // get_buffer_req and populate port defn structure
6867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
6868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->m_port_def.nPortIndex = 1;
6869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = omx->update_portdef(&(omx->m_port_def));
6870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
6871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
6872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
6873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
6874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  default:
6875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    break;
6876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return 1;
6878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6880e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
6881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   OMX_HANDLETYPE hComp,
6882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   OMX_BUFFERHEADERTYPE *buffer
6883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                           )
6884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
6886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Empty this arbitrary");
6887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (buffer == NULL)
6889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
6891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
6893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
6894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
6895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return zero length and not an EOS buffer */
6897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* return buffer if input flush in progress */
6898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
6899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
6900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
6902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
6903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
6904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (psource_frame == NULL)
6907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
6909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    psource_frame = buffer;
6910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
6911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    push_input_buffer (hComp);
6912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
6914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
6916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL))
6917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
6919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
6924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6926e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
6929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_ERRORTYPE ret = OMX_ErrorNone;
6930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (pdest_frame == NULL || psource_frame == NULL)
6932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if we have a destination buffer*/
6934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame == NULL)
6935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
6937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_free_q.m_size)
6938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_free_q.pop_entry(&address,&p2,&id);
6940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
6941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame->nFilledLen = 0;
6942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = LLONG_MAX;
6943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
6944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if we have a destination buffer*/
6948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (psource_frame == NULL)
6949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_input_pending_q.m_size)
6952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
6953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_pending_q.pop_entry(&address,&p2,&id);
6954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame = (OMX_BUFFERHEADERTYPE *)address;
6955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
6956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                psource_frame->nTimeStamp);
6957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
6958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame->nFlags,psource_frame->nFilledLen);
6959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
6961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while ((pdest_frame != NULL) && (psource_frame != NULL))
6966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
6967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch (codec_type_parse)
6968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_MPEG4:
6970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_H263:
6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case CODEC_TYPE_MPEG2:
6972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret =  push_input_sc_codec(hComp);
6973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
6974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_H264:
6975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret = push_input_h264(hComp);
6976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
6977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case CODEC_TYPE_VC1:
6978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret = push_input_vc1(hComp);
6979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
6980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ret != OMX_ErrorNone)
6982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
6983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
6984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      omx_report_error ();
6985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
6986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
6987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
6988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return ret;
6990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
6991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6992e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
6993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
6994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_U32 partial_frame = 1;
6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
6996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
6997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
6998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
6999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame,psource_frame->nTimeStamp);
7000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_frame_parser.parse_sc_frame(psource_frame,
7001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       pdest_frame,&partial_frame) == -1)
7002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
7004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
7005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (partial_frame == 0)
7008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
7010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pdest_frame->nFilledLen,psource_frame,frame_count);
7011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
7014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*First Parsed buffer will have only header Hence skip*/
7015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (frame_count == 0)
7016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
7018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(codec_type_parse == CODEC_TYPE_MPEG4 ||
7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         codec_type_parse == CODEC_TYPE_DIVX) {
7021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4StreamType psBits;
7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        psBits.numBytes = pdest_frame->nFilledLen;
7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mp4_headerparser.parseHeader(&psBits);
7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      frame_count++;
7028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pdest_frame->nFilledLen)
7033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Push the frame to the Decoder*/
7035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        frame_count++;
7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
7041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_input_free_q.m_size)
7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_input_free_q.pop_entry(&address,&p2,&id);
7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen = 0;
7047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
7050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
7052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame = NULL;
7054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else
7058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
7060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Check if Destination Buffer is full*/
7061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pdest_frame->nAllocLen ==
7062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame->nFilledLen + pdest_frame->nOffset)
7063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
7065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorStreamCorrupt;
7066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (psource_frame->nFilledLen == 0)
7070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
7072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame)
7074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags |= psource_frame->nFlags;
7076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
7077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
7078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
7079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame->nFilledLen,frame_count++);
7080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Push the frame to the Decoder*/
7081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        frame_count++;
7086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = NULL;
7087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
7091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
7092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly   }
7094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(generate_ebd)
7095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
7097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      psource_frame = NULL;
7099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (m_input_pending_q.m_size)
7101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
7103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        m_input_pending_q.pop_entry(&address,&p2,&id);
7104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame = (OMX_BUFFERHEADERTYPE *) address;
7105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
7106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                psource_frame->nTimeStamp);
7107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
7108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        psource_frame->nFlags,psource_frame->nFilledLen);
7109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly   }
7112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
7113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7115e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
7116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_U32 partial_frame = 1;
7118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  unsigned address,p2,id;
7119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_BOOL isNewFrame = OMX_FALSE;
7120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BOOL generate_ebd = OMX_TRUE;
7121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (h264_scratch.pBuffer == NULL)
7123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
7125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorBadParameter;
7126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
7128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
7129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
7130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (h264_scratch.nFilledLen && look_ahead_nal)
7131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    look_ahead_nal = false;
7133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         h264_scratch.nFilledLen)
7135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              h264_scratch.pBuffer,h264_scratch.nFilledLen);
7138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
7140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      h264_scratch.nFilledLen = 0;
7141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
7145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
7146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nal_length == 0)
7149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
7151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_sc_frame(psource_frame,
7152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
7153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
7155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorBadParameter;
7156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
7161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_frame_parser.parse_h264_nallength(psource_frame,
7162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &h264_scratch,&partial_frame) == -1)
7163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
7165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return OMX_ErrorBadParameter;
7166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (partial_frame == 0)
7170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (nal_count == 0 && h264_scratch.nFilledLen == 0)
7172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
7174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nal_count++;
7175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_scratch.nFlags = psource_frame->nFlags;
7177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
7179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
7181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(h264_scratch.nFilledLen)
7182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
7184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 NALU_TYPE_SPS);
7185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
7189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // If timeinfo is present frame info from SEI is already processed
7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
7192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  h264_scratch.nFilledLen, NALU_TYPE_SEI);
7193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
7195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_count++;
7196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
7197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nTimeStamp = h264_last_au_ts;
7198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFlags = h264_last_au_flags;
7199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR
7200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_parser->update_panscan_data(h264_last_au_ts);
7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
7205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = h264_scratch.nTimeStamp;
7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_flags = h264_scratch.nFlags;
7208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
7211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
7212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (!VALID_TS(h264_last_au_ts))
7213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_last_au_ts = ts_in_sei;
7214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
7215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else
7217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_last_au_ts = LLONG_MAX;
7218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!isNewFrame)
7221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen)
7224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
7226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.nFilledLen);
7227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              h264_scratch.pBuffer,h264_scratch.nFilledLen);
7229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
7231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
7232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          h264_scratch.nFilledLen = 0;
7233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
7235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
7237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
7238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        look_ahead_nal = true;
7243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
7244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen,frame_count++);
7247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pdest_frame->nFilledLen == 0)
7249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          look_ahead_nal = false;
7252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               h264_scratch.nFilledLen)
7254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
7257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            h264_scratch.nFilledLen = 0;
7259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else
7261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
7263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            return OMX_ErrorBadParameter;
7264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
7269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Reset the EOS Flag");
7271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
7272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /*Push the frame to the Decoder*/
7274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
7276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
7277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          //frame_count++;
7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pdest_frame = NULL;
7280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (m_input_free_q.m_size)
7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_input_free_q.pop_entry(&address,&p2,&id);
7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen = 0;
7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFlags = 0;
7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = LLONG_MAX;
7288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
7289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
7296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if Destination Buffer is full*/
7297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_scratch.nAllocLen ==
7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.nFilledLen + h264_scratch.nOffset)
7299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorStreamCorrupt;
7302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!psource_frame->nFilledLen)
7306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
7308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
7310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (pdest_frame)
7312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
7314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
7315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly             h264_scratch.nFilledLen)
7316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
7318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  h264_scratch.pBuffer,h264_scratch.nFilledLen);
7319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pdest_frame->nFilledLen += h264_scratch.nFilledLen;
7320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          h264_scratch.nFilledLen = 0;
7321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
7325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
7328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
7330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (frame_count == 0)
7331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_HIGH("No frames sent to driver yet, "
7333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              "So send zero length EOS buffer");
7334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           pdest_frame->nFilledLen = 0;
7335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("pdest_frame->nFilledLen = %d, nFlags = 0x%x, TimeStamp = %x",
7338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     pdest_frame->nFilledLen, pdest_frame->nFlags, pdest_frame->nTimeStamp);
7339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
7340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
7341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_TIMEINFO_EXTRADATA)
7342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
7343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
7344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!VALID_TS(pdest_frame->nTimeStamp))
7345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nTimeStamp = ts_in_sei;
7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /*Push the frame to the Decoder*/
7349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
7350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return OMX_ErrorBadParameter;
7352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        frame_count++;
7354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pdest_frame = NULL;
7355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
7357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
7358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
7359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     pdest_frame,h264_scratch.nFilledLen);
7360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        generate_ebd = OMX_FALSE;
7361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
7362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(generate_ebd && !psource_frame->nFilledLen)
7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
7367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    psource_frame = NULL;
7368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_input_pending_q.m_size)
7369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
7371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_input_pending_q.pop_entry(&address,&p2,&id);
7372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame = (OMX_BUFFERHEADERTYPE *) address;
7373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
7374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      psource_frame->nFlags,psource_frame->nFilledLen);
7375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return OMX_ErrorNone;
7378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7380e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
7381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U8 *buf, *pdest;
7383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U32 partial_frame = 1;
7384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U32 buf_len, dest_len;
7385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(first_frame == 0)
7387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        first_frame = 1;
7389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
7390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(!m_vendor_config.pData)
7391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
7393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            buf = psource_frame->pBuffer;
7394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            buf_len = psource_frame->nFilledLen;
7395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
7397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                VC1_SP_MP_START_CODE)
7398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_vc1_profile = VC1_SP_MP_RCV;
7400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
7402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                m_vc1_profile = VC1_AP;
7404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
7406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
7408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorStreamCorrupt;
7409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
7412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
7413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
7414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nOffset;
7415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
7416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nOffset);
7417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(dest_len < m_vendor_config.nDataSize)
7419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\nDestination buffer full\n");
7421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorBadParameter;
7422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else
7424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
7426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
7427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
7429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch(m_vc1_profile)
7432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
7433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case VC1_AP:
7434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
7435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (push_input_sc_codec(hComp) != OMX_ErrorNone)
7436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
7437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
7438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                return OMX_ErrorBadParameter;
7439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
7440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
7441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case VC1_SP_MP_RCV:
7443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        default:
7444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n");
7445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            return OMX_ErrorBadParameter;
7446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
7447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
7448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
7449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
7451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
7452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_U32 alignment)
7453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
7454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  struct pmem_allocation allocation;
7455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  allocation.size = buffer_size;
7456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  allocation.align = clip2(alignment);
7457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (allocation.align < 4096)
7458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    allocation.align = 4096;
7460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
7462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
7463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
7464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
7465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return false;
7466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
7467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return true;
7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7469090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly#endif
7470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
7473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
7474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	      struct ion_fd_data *fd_data,int flag)
7475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int fd = -EINVAL;
7477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -EINVAL;
7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int ion_dev_flag;
7479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ion ion_buf_info;
7480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!alloc_data || buffer_size <= 0 || !fd_data) {
7481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
7482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return -EINVAL;
7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode && flag == CACHED)
7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ion_dev_flag = O_RDONLY;
7487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7488e1b75ccf790ae63be6a99f617a1927d1e003cac9Haynes Mathew George    ion_dev_flag = (O_RDONLY | O_DSYNC);
7489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd = open (MEM_DEVICE, ion_dev_flag);
7491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (fd < 0) {
7492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
7493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return fd;
7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->len = buffer_size;
7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alloc_data->align = clip2(alignment);
7497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (alloc_data->align < 4096)
7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->align = 4096;
7500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(secure_mode) {
7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_SECURE);
7503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7504a370c157f9ab6a5d4576820acd09dd4239879ffaHaynes Mathew George    alloc_data->flags = (ION_HEAP(ION_IOMMU_HEAP_ID));
7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc || !alloc_data->handle) {
7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alloc_data->handle = NULL;
7510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fd_data->handle = alloc_data->handle;
7515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(fd,ION_IOC_MAP,fd_data);
7516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rc) {
7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ION MAP failed ");
7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_alloc_data = *alloc_data;
7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.ion_device_fd = fd;
7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_buf_info.fd_ion_data = *fd_data;
7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_ion_memory(&ion_buf_info);
7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd_data->fd =-1;
7523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fd);
7524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fd = -ENOMEM;
7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return fd;
7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(!buf_ion_info) {
7533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return;
7535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             &buf_ion_info->ion_alloc_data.handle)) {
7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("\n ION: free failed" );
7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     close(buf_ion_info->ion_device_fd);
7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_device_fd = -1;
7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->ion_alloc_data.handle = NULL;
7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf_ion_info->fd_ion_data.fd = -1;
7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  output_use_buffer = false;
7550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ouput_egl_buffers = false;
7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_out_mem_ptr)
7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (m_out_mem_ptr);
7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = NULL;
7556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_platform_list)
7559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free(m_platform_list);
7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_platform_list = NULL;
7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_respbuffer)
7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_respbuffer);
7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = NULL;
7568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.ptr_outputbuffer)
7570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free (drv_ctx.ptr_outputbuffer);
7572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = NULL;
7573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (arbitrary_bytes)
7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_frame_parser.mutils)
7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free utils parser");
7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete (m_frame_parser.mutils);
7592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_frame_parser.mutils = NULL;
7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_inp_heap_ptr)
7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input Heap Pointer");
7598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_inp_heap_ptr);
7599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_inp_heap_ptr = NULL;
7600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_phdr_pmem_ptr)
7603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free (m_phdr_pmem_ptr);
7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_phdr_pmem_ptr = NULL;
7607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_inp_mem_ptr)
7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (m_inp_mem_ptr);
7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_inp_mem_ptr = NULL;
7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ptr_inputbuffer)
7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Free Driver Context pointer");
7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free (drv_ctx.ptr_inputbuffer);
7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.ptr_inputbuffer = NULL;
7620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free ion context");
7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.ip_buf_ion_info);
7625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
7631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int buf_size = 0, extra_data_size = 0;
7635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
7636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
7638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = buffer_prop;
7639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_GET_BUFFER_REQ,
7640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (void*)&ioctl_msg) < 0)
7641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
7643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorInsufficientResources;
7644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = buffer_prop->buffer_size;
7648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Frame info extra data enabled!");
7651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_INTERLACE_EXTRADATA)
7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Interlace extra data enabled!");
7656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_PORTDEF_EXTRADATA)
7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
7661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
7662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         extra_data_size);
7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (extra_data_size)
7665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
7667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
7668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size += extra_data_size;
7670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig) // BufReq will be set to driver when port is disabled
7674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (buf_size != buffer_prop->buffer_size)
7676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size = buf_size;
7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = set_buffer_req(buffer_prop);
7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
7687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned buf_size = 0;
7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    buffer_prop->actualcount, buffer_prop->buffer_size);
7693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
7694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buf_size != buffer_prop->buffer_size)
7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
7697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buffer_prop->buffer_size, buf_size);
7698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadParameter;
7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = buffer_prop;
7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_BUFFER_REQ,
7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (void*)&ioctl_msg) < 0)
7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Setting buffer requirements failed");
7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorInsufficientResources;
770940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
771040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!client_buffers.update_buffer_req()) {
771140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
771240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        eRet = OMX_ErrorInsufficientResources;
771340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      }
7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::start_port_reconfig()
7720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  eRet = update_picture_resolution();
7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (eRet == OMX_ErrorNone)
7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = &drv_ctx.interlace;
7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_INTERLACE_FORMAT, &ioctl_msg))
7728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_INTERLACE_FORMAT");
7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorHardware;
7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
7735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_HIGH("Interlace format detected (%x)!", drv_ctx.interlace);
7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!secure_mode)
7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            client_extradata |= OMX_INTERLACE_EXTRADATA;
7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
7740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("secure mode interlaced format not supported");
7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorUnsupportedSetting;
7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      in_reconfig = true;
7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
7746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = get_buffer_req(&op_buf_rcnfg);
7747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = &drv_ctx.video_resolution;
7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg))
7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorHardware;
7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!portDefn)
7770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->nSize = sizeof(portDefn);
7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->eDomain    = OMX_PortDomainVideo;
7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.frame_rate.fps_denominator > 0)
7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        drv_ctx.frame_rate.fps_denominator;
7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else {
7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error: Divide by zero \n");
7782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
7783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (0 == portDefn->nPortIndex)
7785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirInput;
7787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
7788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
7789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
7790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
7791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = eCompressionFormat;
7792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_inp_bEnabled;
7793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_inp_bPopulated;
7794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (1 == portDefn->nPortIndex)
7796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir =  OMX_DirOutput;
7798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (update_picture_resolution() != OMX_ErrorNone)
7799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ALOGE(" update_picture_resolution failed \n");
7801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorHardware;
7802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
780340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.update_buffer_req()) {
780440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
780540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
780640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
7807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (in_reconfig)
7808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = op_buf_rcnfg.mincount;
7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = op_buf_rcnfg.buffer_size;
7812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
7816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
7817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn->nBufferSize        = drv_ctx.op_buf.buffer_size;
7818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
781940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    unsigned int buf_size = 0;
782040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.get_buffer_req(buf_size)) {
782140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n update buffer requirements");
782240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
782340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
782440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    portDefn->nBufferSize = buf_size;
7825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
7826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bEnabled   = m_out_bEnabled;
7827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->bPopulated = m_out_bPopulated;
782840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
782940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Error in getting color format");
783040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return OMX_ErrorHardware;
7831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
7834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
7835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->eDir = OMX_DirMax;
7836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
7837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             (int)portDefn->nPortIndex);
7838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadPortIndex;
7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
7844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("update_portdef Width = %d Height = %d Stride = %u"
7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "SliceHeight = %u \n", portDefn->format.video.nFrameHeight,
7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nFrameWidth,
7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nStride,
7848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portDefn->format.video.nSliceHeight);
7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *bufHdr = NULL;
7857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i= 0;
7858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_out_mem_ptr) {
7860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
7861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nBufHdrSize        = 0;
7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformEntrySize = 0;
7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPlatformListSize  = 0;
7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int nPMEMInfoSize = 0;
7865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
7867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
7870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nBufHdrSize        = drv_ctx.op_buf.actualcount *
7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE);
7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformListSize  = drv_ctx.op_buf.actualcount *
7877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
7878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPlatformEntrySize = drv_ctx.op_buf.actualcount *
7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
7880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         sizeof(OMX_BUFFERHEADERTYPE),
7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPMEMInfoSize,
7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         nPlatformListSize);
7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
7886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         m_out_bm_count);
7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Alloc mem for platform specific info
7889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *pPtr=NULL;
7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     nPMEMInfoSize,1);
7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
7893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_bufferpayload),
7894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
7896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof (struct vdec_output_frameinfo),
7897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.actualcount);
7898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
7900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
7904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       && drv_ctx.ptr_respbuffer)
7905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bufHdr          =  m_out_mem_ptr;
7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
7908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
7909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_list)  + nPlatformListSize);
7910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
7911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (((char *) m_platform_entry) + nPlatformEntrySize);
7912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList   = m_platform_list;
7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry  = m_platform_entry;
7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo       = m_pmem_info;
7915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Settting the entire storage nicely
7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_out_mem_ptr,pPlatformEntry);
7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
7925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Set the values when we determine the right HxW param
7927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nAllocLen          = 0;
7928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nFilledLen         = 0;
7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pAppPrivate        = NULL;
7930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
7931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry->entry      = pPMEMInfo;
7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Initialize the Platform List
7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->nEntries    = 1;
7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList->entryList   = pPlatformEntry;
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Keep pBuffer NULL till vdec is opened
7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pBuffer            = NULL;
7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->offset          =  0;
7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo->pmem_fd = 0;
7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pPlatformPrivate = pPlatformList;
7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /*Create a mapping between buffers*/
7946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer[i].client_data = (void *) \
7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                            &drv_ctx.ptr_outputbuffer[i];
7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Move the buffer and buffer header pointers
7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        bufHdr++;
7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo++;
7952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry++;
7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList++;
7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\
7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                        m_out_mem_ptr, pPtr);
7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_out_mem_ptr)
7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_out_mem_ptr);
7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_out_mem_ptr = NULL;
7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPtr)
7966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPtr);
7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPtr = NULL;
7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_outputbuffer)
7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_outputbuffer);
7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_outputbuffer = NULL;
7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(drv_ctx.ptr_respbuffer)
7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(drv_ctx.ptr_respbuffer);
7978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ptr_respbuffer = NULL;
7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	free(drv_ctx.op_buf_ion_info);
7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet =  OMX_ErrorInsufficientResources;
7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } else {
7990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet =  OMX_ErrorInsufficientResources;
7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
7992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p1;
7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned p2;
7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned ident;
8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_cmd_queue tmp_q, pending_bd_q;
8001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&m_lock);
8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE FDB from ftb queue
8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_ftb_q.m_size)
8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.pop_entry(&p1,&p2,&ident);
8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_FBD)
8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
8013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to ftb queue
8016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
8019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.insert_entry(p1,p2,ident);
8020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // pop all pending GENERATE EDB from etb queue
8022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (m_etb_q.m_size)
8023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.pop_entry(&p1,&p2,&ident);
8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ident == OMX_COMPONENT_GENERATE_EBD)
8026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pending_bd_q.insert_entry(p1,p2,ident);
8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      tmp_q.insert_entry(p1,p2,ident);
8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //return all non GENERATE FDB to etb queue
8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(tmp_q.m_size)
8036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    tmp_q.pop_entry(&p1,&p2,&ident);
8038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.insert_entry(p1,p2,ident);
8039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&m_lock);
8041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // process all pending buffer dones
8042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(pending_bd_q.m_size)
8043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_bd_q.pop_entry(&p1,&p2,&ident);
8045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(ident)
8046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_EBD:
8048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
8054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_COMPONENT_GENERATE_FBD:
8056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
8057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
8059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          omx_report_error ();
8060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
8062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
8067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 new_frame_interval = 0;
8069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
8070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
8071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
8072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    new_frame_interval = (act_timestamp > prev_ts)?
8074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          act_timestamp - prev_ts :
8075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          prev_ts - act_timestamp;
8076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (new_frame_interval < frm_int || frm_int == 0)
8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frm_int = new_frame_interval;
8079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(frm_int)
8080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_numerator = 1e6;
8082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.frame_rate.fps_denominator = frm_int;
8083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
8084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         frm_int, drv_ctx.frame_rate.fps_numerator /
8085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         (float)drv_ctx.frame_rate.fps_denominator);
8086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ioctl_msg.in = &drv_ctx.frame_rate;
8087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
8088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (void*)&ioctl_msg) < 0)
8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("Setting frame rate failed");
8091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prev_ts = act_timestamp;
8096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (rst_prev_ts && VALID_TS(act_timestamp))
8101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    prev_ts = act_timestamp;
8103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = false;
8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (VALID_TS(prev_ts))
8106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bool codec_cond = (drv_ctx.timestamp_adjust)?
8108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
8111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(frm_int > 0 && codec_cond)
8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      act_timestamp = prev_ts + frm_int;
8115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      prev_ts = act_timestamp;
8117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      set_frame_rate(act_timestamp);
8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (frm_int > 0)           // In this case the frame rate was set along
8122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {                               // with the port definition, start ts with 0
8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    rst_prev_ts = true;
8125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_conceal_MB = 0;
8132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_S64 ts_in_sei = 0;
8133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 frame_rate = 0;
8134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8135edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
8136edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
8137edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George
8138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_extra = (OMX_OTHER_EXTRADATATYPE *)
8139edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George           ((unsigned)(pBuffer + p_buf_hdr->nOffset +
8140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_buf_hdr->nFilledLen + 3)&(~3));
8141edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George  if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
8142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = NULL;
8143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
8144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Process driver extradata
8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
8147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
8149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
8150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->nSize < p_extra->nDataSize)
8151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
8153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          p_extra->nSize, p_extra->nDataSize);
8154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8155edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George        if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
8156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            p_extra->nDataSize == 0 || p_extra->nSize == 0)
8157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra = NULL;
8158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          continue;
8159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
8161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
8163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          num_conceal_MB = count_MB_in_extradata(p_extra);
8164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
8165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          // Map driver extradata to corresponding OMX type
8166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
8167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
8168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_debug_concealedmb) {
8171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
8172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
8174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_SEI)
8176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_sei = p_extra;
8178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (p_extra->eType == VDEC_EXTRADATA_VUI)
8184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_vui = p_extra;
8186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
8188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
8190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      print_debug_extradata(p_extra);
8192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8193edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George      if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) ||
8194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_extra->nDataSize == 0 || p_extra->nSize == 0)
8195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_extra = NULL;
8196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
8198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Driver extradata is only exposed if MB map is requested by client,
8200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // otherwise can be overwritten by omx extradata.
8201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_extra = (OMX_OTHER_EXTRADATATYPE *)
8202edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George               ((unsigned)(pBuffer + p_buf_hdr->nOffset +
8203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                p_buf_hdr->nFilledLen + 3)&(~3));
8204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
8205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
8209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (client_extradata & OMX_TIMEINFO_EXTRADATA)
8212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_vui)
8214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
8215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_sei)
8216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
8218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (!VALID_TS(p_buf_hdr->nTimeStamp))
8219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp = ts_in_sei;
8220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
8222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // If timeinfo is present frame info from SEI is already processed
8223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
8224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
8227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
8228edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_interlace_extradata(p_extra,
8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format);
8233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
8236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
8237edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* vui extra data (frame_rate) information */
8241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (h264_parser)
8242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_parser->get_frame_rate(&frame_rate);
8243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_frame_info_extradata(p_extra, num_conceal_MB,
8244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
8245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buf_hdr->nTimeStamp, frame_rate,
8246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        &((struct vdec_output_frameinfo *)
8247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
8248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
8251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       p_extra != NULL &&
8252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
8253edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George       (pBuffer + p_buf_hdr->nAllocLen))
8254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
8256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    append_portdef_extradata(p_extra);
8257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
8260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (p_extra &&
8261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
8262edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George        (pBuffer + p_buf_hdr->nAllocLen))
8263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      append_terminator_extradata(p_extra);
8264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
8267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
8268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
8272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE ret = OMX_ErrorNone;
8274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 driver_extradata = 0, extradata_size = 0;
8275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
8276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_state != OMX_StateLoaded)
8277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
8279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return OMX_ErrorIncorrectStateOperation;
8280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
8282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
8283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_INTERLACE_EXTRADATA)
8284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
8285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_PORTDEF_EXTRADATA)
8286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
8288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
8290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata, requested_extradata, enable);
8291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (enable)
8293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata |= client_extradata;
8294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    requested_extradata = client_extradata & ~requested_extradata;
8297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extradata_size *= -1;
8298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
8301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
8302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
8303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
8304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
8307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
8308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
8309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
8310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (driver_extradata != drv_ctx.extradata)
8314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.extradata = driver_extradata;
8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.in = &drv_ctx.extradata;
8318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ioctl_msg.out = NULL;
8319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (void*)&ioctl_msg) < 0)
8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nSet extradata failed");
8323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = OMX_ErrorUnsupportedSetting;
8324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ret = get_buffer_req(&drv_ctx.op_buf);
8327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
8329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    client_extradata = requested_extradata;
8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.op_buf.buffer_size += extradata_size;
8332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // align the buffer size
8333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan 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));
8334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size);
8335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
8336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
8337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ret = set_buffer_req(&drv_ctx.op_buf);
8338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ret;
8340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
8345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *data_ptr = extra->data, data = 0;
8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (byte_count < extra->nDataSize)
8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data = *data_ptr;
8349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (data)
8350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      num_MB += (data&0x01);
8352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      data >>= 1;
8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    data_ptr++;
8355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    byte_count++;
8356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (drv_ctx.video_resolution.frame_height + 15)) >> 8;
8359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
8360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!m_debug_extradata)
8366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return;
8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH(
8369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "============== Extra Data ==============\n"
8370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Size: %u \n"
8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "        Version: %u \n"
8372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "      PortIndex: %u \n"
8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "           Type: %x \n"
8374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    "       DataSize: %u \n",
8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nSize, extra->nVersion.nVersion,
8376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra->nPortIndex, extra->eType, extra->nDataSize);
8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (extra->eType == OMX_ExtraDataInterlaceFormat)
8379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "------ Interlace Format ------\n"
8383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "                Size: %u \n"
8384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Version: %u \n"
8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           PortIndex: %u \n"
8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Is Interlace Format: %u \n"
8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Interlace Formats: %u \n"
8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "=========== End of Interlace ===========\n",
8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataFrameInfo)
8393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
8397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "-------- Frame Format --------\n"
8398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "             Picture Type: %u \n"
8399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Interlace Type: %u \n"
8400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      " Pan Scan Total Frame Num: %u \n"
8401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "   Concealed Macro Blocks: %u \n"
8402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "               frame rate: %u \n"
8403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio X: %u \n"
8404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "           Aspect Ratio Y: %u \n",
8405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->ePicType,
8406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->interlaceType,
8407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->panScan.numWindows,
8408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nConcealedMacroblocks,
8409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->nFrameRate,
8410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioX,
8411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fminfo->aspectRatio.aspectRatioY);
8412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (int i = 0; i < fminfo->panScan.numWindows; i++)
8414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH(
8416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "------------------------------\n"
8417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "     Pan Scan Frame Num: %d \n"
8418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle x: %d \n"
8419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "            Rectangle y: %d \n"
8420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dx: %d \n"
8421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        "           Rectangle dy: %d \n",
8422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
8423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
8424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
8427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (extra->eType == OMX_ExtraDataNone)
8429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("========== End of Terminator ===========");
8431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
8435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
8437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                          OMX_U32 interlaced_format_type)
8441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_STREAMINTERLACEFORMAT *interlace_format;
8443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 mbaff = 0;
8444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
8445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
8448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
8450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
8451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
8452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
8454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((interlaced_format_type == VDEC_InterlaceFrameProgressive)  && !mbaff)
8455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_FALSE;
8457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
8458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
8459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->bInterlaceFormat = OMX_TRUE;
8463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
8464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
8465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
8470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp,
8471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 frame_rate, struct vdec_aspectratioinfo *aspect_ratio_info)
8472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
8474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
8475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
8478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
8479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
8480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch (picture_type)
8482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_I:
8484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeI;
8485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_P:
8487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeP;
8488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case PICTURE_TYPE_B:
8490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      frame_info->ePicType = OMX_VIDEO_PictureTypeB;
8491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
8492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
8493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
8494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
8496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
8497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
8498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
8499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
8501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->panScan,0,sizeof(frame_info->panScan));
8502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
8503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
8506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fill_aspect_ratio_info(aspect_ratio_info, frame_info);
8509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nConcealedMacroblocks = num_conceal_mb;
8510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  frame_info->nFrameRate = frame_rate;
8511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::fill_aspect_ratio_info(
8515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       struct vdec_aspectratioinfo *aspect_ratio_info,
8516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
8517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata = frame_info;
8519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata->aspectRatio.aspectRatioX = 0;
8521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_extradata->aspectRatio.aspectRatioY = 0;
8522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
8524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     h264_parser->fill_aspect_ratio_info(&m_extradata->aspectRatio);
8526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG4 ||
8529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_3 ||
8530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4 ||
8531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5 ||
8532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_6)
8533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      mp4_fill_aspect_ratio_info(aspect_ratio_info,m_extradata);
8535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_extradata->aspectRatio.aspectRatioX == 0 ||
8538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_extradata->aspectRatio.aspectRatioY == 0) {
8539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_extradata->aspectRatio.aspectRatioX = 1;
8540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       m_extradata->aspectRatio.aspectRatioY = 1;
8541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
8547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
8548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
8550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
8551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
8552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
8553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  *portDefn = m_port_def;
8554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
8555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
8556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nFrameWidth,
8557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nStride,
8558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     portDefn->format.video.nSliceHeight);
8559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
8562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
8564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nVersion.nVersion = OMX_SPEC_VERSION;
8565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->eType = OMX_ExtraDataNone;
8566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->nDataSize = 0;
8567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  extra->data[0] = 0;
8568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  print_debug_extradata(extra);
8570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
8573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
8575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (index >= drv_ctx.ip_buf.actualcount)
8576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
8578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr = (desc_buffer_hdr*) \
8583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     calloc( (sizeof(desc_buffer_hdr)),
8584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     drv_ctx.ip_buf.actualcount);
8585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (m_desc_buffer_ptr == NULL)
8586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
8588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
8593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr[index].buf_addr == NULL)
8594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
8596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
8600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
8603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
8605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_demux_entries < 8192)
8606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_demux_offsets[m_demux_entries++] = address_offset;
8608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
8613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
8615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
8616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 index = 0;
8617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (index < bytes_to_parse)
8621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
8624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
8625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (buf[index+2] == 0x01)) )
8626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //Found start code, insert address offset
8628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      insert_demux_addr_offset(index);
8629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf[index+2] == 0x01) // 3 byte start code
8630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 3;
8631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else                      //4 byte start code
8632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index += 4;
8633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
8635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index++;
8636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
8638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
8639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //fix this, handle 3 byte start code, vc1 terminator entry
8644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U8 *p_demux_data = NULL;
8645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 desc_data = 0;
8646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 start_addr = 0;
8647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 nal_size = 0;
8648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 suffix_byte = 0;
8649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 demux_index = 0;
8650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 buffer_index = 0;
8651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (m_desc_buffer_ptr == NULL)
8653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
8655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
8659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buffer_index > drv_ctx.ip_buf.actualcount)
8660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index);
8662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
8666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ( ((OMX_U8*)p_demux_data == NULL) ||
8668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
8669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
8671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorBadParameter;
8672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
8674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (; demux_index < m_demux_entries; demux_index++)
8676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      start_addr = m_demux_offsets[demux_index];
8679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
8680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
8682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
8686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (demux_index < (m_demux_entries - 1))
8688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
8690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
8692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
8694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
8696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        start_addr,
8697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        suffix_byte,
8698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        nal_size,
8699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        demux_index);
8700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = (start_addr >> 3) << 1;
8701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= (start_addr & 7) << 21;
8702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data |= suffix_byte << 24;
8703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
8706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (codec_type_parse == CODEC_TYPE_VC1)
8712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("VC1 terminator entry");
8714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0;
8715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      desc_data = 0x82 << 24;
8716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
8717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 4, 0, sizeof(OMX_U32));
8718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 8, 0, sizeof(OMX_U32));
8719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(p_demux_data + 12, 0, sizeof(OMX_U32));
8720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_demux_data += 16;
8721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_demux_entries++;
8722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //Add zero word to indicate end of descriptors
8724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(p_demux_data, 0, sizeof(OMX_U32));
8725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
8727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
8728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
8730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_demux_entries = 0;
8731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Demux table complete!");
8732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
8733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
8736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::vdec_alloc_h264_mv()
8737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 pmem_fd = -1;
8739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 width, height, size, alignment;
8740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  void *buf_addr = NULL;
8741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_ioctl_msg ioctl_msg;
8742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
8743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem_allocation allocation;
8744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_h264_mv h264_mv;
8746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct vdec_mv_buff_size mv_buff_size;
8747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mv_buff_size.width = drv_ctx.video_resolution.stride;
8749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mv_buff_size.height = drv_ctx.video_resolution.scan_lines>>2;
8750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = NULL;
8752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = (void*)&mv_buff_size;
8753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_GET_MV_BUFFER_SIZE, (void*)&ioctl_msg) < 0)
8755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n GET_MV_BUFFER_SIZE Failed for width: %d, Height %d" ,
8757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      mv_buff_size.width, mv_buff_size.height);
8758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("GET_MV_BUFFER_SIZE returned: Size: %d and alignment: %d",
8762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    mv_buff_size.size, mv_buff_size.alignment);
8763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  size = mv_buff_size.size * drv_ctx.op_buf.actualcount;
8765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  alignment = mv_buff_size.alignment;
8766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("Entered vdec_alloc_h264_mv act_width: %d, act_height: %d, size: %d, alignment %d\n",
8768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height,size,alignment);
8769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.h264_mv.ion_device_fd = alloc_map_ion_memory(
8773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    size, 8192,
8774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.h264_mv.ion_alloc_data,
8775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &drv_ctx.h264_mv.fd_ion_data,CACHED);
8776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (drv_ctx.h264_mv.ion_device_fd < 0) {
8777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
8778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = drv_ctx.h264_mv.fd_ion_data.fd;
8780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
8781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.size = size;
8782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.align = clip2(alignment);
8783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (allocation.align != 8192)
8784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    allocation.align = 8192;
8785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = open(MEM_DEVICE, O_RDWR);
8787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((int)(pmem_fd) < 0)
8789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorInsufficientResources;
8790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
8792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
8794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
8795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!secure_mode) {
8799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_addr = mmap(NULL, size,
8800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   PROT_READ | PROT_WRITE,
8801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   MAP_SHARED, pmem_fd, 0);
8802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (buf_addr == (void*) MAP_FAILED)
8804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
8805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        close(pmem_fd);
8806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free_ion_memory(&drv_ctx.h264_mv);
8808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pmem_fd = -1;
8810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
8811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
8812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
8813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   } else
8814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      buf_addr =(unsigned char *) (pmem_fd + 1234);
8815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Allocated virt:%p, FD: %d of size %d count: %d \n", buf_addr,
8816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   pmem_fd, size, drv_ctx.op_buf.actualcount);
8817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.size = size;
8819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.count = drv_ctx.op_buf.actualcount;
8820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.pmem_fd = pmem_fd;
8821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv.offset = 0;
8822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.in = (void*)&h264_mv;
8824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ioctl_msg.out = NULL;
8825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_H264_MV_BUFFER, (void*)&ioctl_msg) < 0)
8827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
8828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Failed to set the H264_mv_buffers\n");
8829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorInsufficientResources;
8830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
8831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.buffer = (unsigned char *) buf_addr;
8833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.size = size;
8834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.count = drv_ctx.op_buf.actualcount;
8835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.offset = 0;
8836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  h264_mv_buff.pmem_fd = pmem_fd;
8837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Saving virt:%p, FD: %d of size %d count: %d \n", h264_mv_buff.buffer,
8838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   h264_mv_buff.pmem_fd, h264_mv_buff.size, drv_ctx.op_buf.actualcount);
8839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
8840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::vdec_dealloc_h264_mv()
8843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(h264_mv_buff.pmem_fd > 0)
8845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
8846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_H264_MV_BUFFER,NULL) < 0)
8847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_H264_MV_BUFFER failed");
8848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!secure_mode)
8849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          munmap(h264_mv_buff.buffer, h264_mv_buff.size);
8850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(h264_mv_buff.pmem_fd);
8851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
8852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      free_ion_memory(&drv_ctx.h264_mv);
8853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n Cleaning H264_MV buffer of size %d \n",h264_mv_buff.size);
8855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.pmem_fd = -1;
8856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.offset = 0;
8857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.size = 0;
8858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.count = 0;
8859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h264_mv_buff.buffer = NULL;
8860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
8864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
8866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::createDivxDrmContext()
8867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     OMX_ERRORTYPE err = OMX_ErrorNone;
8869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     iDivXDrmDecrypt = DivXDrmDecrypt::Create();
8870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if (iDivXDrmDecrypt) {
8871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
8872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(err!=OMX_ErrorNone) {
8873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
8874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
8875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
8876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
8877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     else {
8879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
8880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          err = OMX_ErrorUndefined;
8881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
8882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return err;
8883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
8884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
8885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
888640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
888740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
888840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  enabled = false;
888940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx = NULL;
889040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  init_members();
889140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  ColorFormat = OMX_COLOR_FormatMax;
889240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
889340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
889440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
889540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
889640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx = reinterpret_cast<omx_vdec*>(client);
889740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
889840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
889940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::init_members() {
890040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  allocated_count = 0;
890140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer_size_req = 0;
890240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  buffer_alignment_req = 0;
890340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_platform_list_client,0,sizeof(m_platform_list_client));
890440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
890540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
890640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
890740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
890840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  for (int i = 0; i < MAX_COUNT;i++)
890940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    pmem_fd[i] = -1;
891040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
891140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
891240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
891340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  c2d.destroy();
891440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
891540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
891640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::update_buffer_req()
891740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
891840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
891940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int src_size = 0, destination_size = 0;
892040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE drv_color_format;
892140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
892240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
892340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
892440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
892540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled){
892640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n No color conversion required");
892740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return status;
892840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
892940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_TILE_4x2 &&
893040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      ColorFormat != OMX_COLOR_FormatYUV420Planar) {
893140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
893240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
893340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
893440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  c2d.close();
893540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
893640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                    omx->drv_ctx.video_resolution.frame_width,
893740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                    YCbCr420Tile,YCbCr420P);
893840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status) {
893940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    status = c2d.get_buffer_size(C2D_INPUT,src_size);
894040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (status)
894140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
894240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
894340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status) {
894440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
894540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        !destination_size) {
894640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
894740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            "driver size %d destination size %d",
894840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
894940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
895040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      c2d.close();
895140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      buffer_size_req = 0;
895240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
895340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      buffer_size_req = destination_size;
895440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
895540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George	     buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
895640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
895740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
895840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
895940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
896040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
896140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
896240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
896340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::set_color_format(
896440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE dest_color_format)
896540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
896640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
896740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_COLOR_FORMATTYPE drv_color_format;
896840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
896940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid client in color convert");
897040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return false;
897140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
897240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
897340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    drv_color_format = (OMX_COLOR_FORMATTYPE)
897440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
897540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else {
897640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Incorrect color format");
897740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    status = false;
897840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
897940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (status && (drv_color_format != dest_color_format)) {
898040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
898140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
898240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
898340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else {
898457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      DEBUG_PRINT_HIGH("\n Planar color format set");
898540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      ColorFormat = OMX_COLOR_FormatYUV420Planar;
898640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (enabled)
898740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        c2d.destroy();
898840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      enabled = false;
898940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!c2d.init()) {
899040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("\n open failed for c2d");
899140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        status = false;
899240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      } else
899340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        enabled = true;
899440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    }
899540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  } else {
899640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (enabled)
899740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      c2d.destroy();
899840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    enabled = false;
899940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
900040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
900140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
900240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
900340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
900440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
900540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
900640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
900740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
900840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
900940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
901040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return omx->m_out_mem_ptr;
901140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return m_out_mem_ptr_client;
901240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
901340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
901440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
901540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George       (OMX_BUFFERHEADERTYPE *bufadd)
901640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
901740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
901840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
901940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
902040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
902140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
902240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return bufadd;
902340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned index = 0;
902440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufadd - omx->m_out_mem_ptr;
902540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index < omx->drv_ctx.op_buf.actualcount) {
902640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
902740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
902840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    bool status;
902940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!omx->in_reconfig && !omx->output_flush_progress) {
903040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
903140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                  bufadd->pBuffer,pmem_fd[index],pmem_baseaddress[index]);
903240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
903340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      if (!status){
903440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
903540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        return NULL;
903640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      }
903740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else
903840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      m_out_mem_ptr_client[index].nFilledLen = 0;
903940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return &m_out_mem_ptr_client[index];
904040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
904140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
904240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return NULL;
904340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
904440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
904540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
904640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                                              (OMX_BUFFERHEADERTYPE *bufadd)
904740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
904840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!omx){
904940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
905040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return NULL;
905140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
905240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
905340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return bufadd;
905440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned index = 0;
905540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufadd - m_out_mem_ptr_client;
905640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index < omx->drv_ctx.op_buf.actualcount) {
905740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return &omx->m_out_mem_ptr[index];
905840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
905940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
906040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return NULL;
906140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
906240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_buffer_req
906340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George          (unsigned int &buffer_size)
906440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
906540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
906640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    buffer_size = omx->drv_ctx.op_buf.buffer_size;
906740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else
906840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
906940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      DEBUG_PRINT_ERROR("\n Get buffer size failed");
907040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      return false;
907140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
907240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
907340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George        buffer_size = omx->drv_ctx.op_buf.buffer_size;
907440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
907540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George	  buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
907640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return true;
907740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
907840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
907940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE *bufhdr) {
908040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int index = 0;
908140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
908240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled)
908340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return omx->free_output_buffer(bufhdr);
908440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (enabled && omx->is_component_secure())
908540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorNone;
908640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!allocated_count || !bufhdr) {
908740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
908840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
908940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
909040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  index = bufhdr - m_out_mem_ptr_client;
909140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (index >= omx->drv_ctx.op_buf.actualcount){
909240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
909340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
909440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
909540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (pmem_fd[index] > 0) {
909640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    munmap(pmem_baseaddress[index], buffer_size_req);
909740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    close(pmem_fd[index]);
909840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
909940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_fd[index] = -1;
910040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  omx->free_ion_memory(&op_buf_ion_info[index]);
910140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_heap_ptr[index].video_heap_ptr = NULL;
910240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (allocated_count > 0)
910340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    allocated_count--;
910440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  else
910540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    allocated_count = 0;
910640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!allocated_count) {
910740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    c2d.close();
910840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    init_members();
910940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
911040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
911140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
911240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
911340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
911440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
911540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
911640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_ERRORTYPE eRet = OMX_ErrorNone;
911740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled){
911840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
911940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return eRet;
912040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
912140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (enabled && omx->is_component_secure()) {
912240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
912340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                      omx->is_component_secure());
912440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorUnsupportedSetting;
912540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
912640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!bufferHdr || bytes > buffer_size_req) {
912740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
912840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %d",
912940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                      buffer_size_req,bytes);
913040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorBadParameter;
913140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
913240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
913340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
913440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
913540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
913640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
913740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
913840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George         port,appData,omx->drv_ctx.op_buf.buffer_size);
913940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (eRet != OMX_ErrorNone || !temp_bufferHdr){
914040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
914140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return eRet;
914240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
914340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
914440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      omx->drv_ctx.op_buf.actualcount) {
914540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n Invalid header index %d",
914640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George             (temp_bufferHdr - omx->m_out_mem_ptr));
914740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorUndefined;
914840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
914940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  unsigned int i = allocated_count;
915040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
915140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    buffer_size_req,buffer_alignment_req,
915240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,CACHED);
915340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
915440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
915540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (op_buf_ion_info[i].ion_device_fd < 0) {
915640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
915740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
915840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
915940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
916040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George                     PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
916140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
916240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (pmem_baseaddress[i] == MAP_FAILED) {
916340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
916440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    close(pmem_fd[i]);
916540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    omx->free_ion_memory(&op_buf_ion_info[i]);
916640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    return OMX_ErrorInsufficientResources;
916740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
916840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_heap_ptr[i].video_heap_ptr = new VideoHeap (
916940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    op_buf_ion_info[i].ion_device_fd,buffer_size_req,
917040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
917140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
917240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_pmem_info_client[i].offset = 0;
917340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
917440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
917540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_list_client[i].nEntries = 1;
917640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_platform_list_client[i].entryList = &m_platform_entry_client[i];
917740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
917840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
917940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nFilledLen = 0;
918040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nFlags = 0;
918140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
918240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
918340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
918440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
918540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
918640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  m_out_mem_ptr_client[i].pAppPrivate = appData;
918740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  *bufferHdr = &m_out_mem_ptr_client[i];
918840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
918940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  allocated_count++;
919040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return eRet;
919140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
919240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
919340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::is_component_secure()
919440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
919540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return secure_mode;
919640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
919740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George
919840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
919940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{
920040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  bool status = true;
920140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  if (!enabled) {
920240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
920340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George     dest_color_format =  (OMX_COLOR_FORMATTYPE)
920440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
920540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
920640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      dest_color_format = OMX_COLOR_FormatYUV420SemiPlanar;
920740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    else
920840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
920940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  } else {
921040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
921140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      status = false;
921240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George    } else
921340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George      dest_color_format = OMX_COLOR_FormatYUV420Planar;
921440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  }
921540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George  return status;
921640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George}
9217fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9218fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::secureDisplay(int mode) {
9219fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (m_secure_display == true) {
9220fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        return 0;
9221fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9222fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9223fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<IServiceManager> sm = defaultServiceManager();
9224fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<qService::IQService> displayBinder =
9225fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        interface_cast<qService::IQService>(sm->getService(String16("display.qservice")));
9226fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9227fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (displayBinder != NULL) {
9228fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        displayBinder->securing(mode);
9229fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        if (mode == qService::IQService::END) {
9230fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George            m_secure_display = true;
9231fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        }
9232fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9233fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    else {
9234fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_ERROR("secureDisplay(%d) display.qservice unavailable", mode);
9235fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9236fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    return 0;
9237fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George}
9238fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9239fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::unsecureDisplay(int mode) {
9240fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (m_secure_display == false) {
9241fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        return 0;
9242fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9243fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9244fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (mode == qService::IQService::END) {
9245fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        m_secure_display = false;
9246fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    }
9247fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9248fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<IServiceManager> sm = defaultServiceManager();
9249fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    sp<qService::IQService> displayBinder =
9250fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        interface_cast<qService::IQService>(sm->getService(String16("display.qservice")));
9251fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George
9252fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    if (displayBinder != NULL)
9253fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        displayBinder->unsecuring(mode);
9254fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    else
9255fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George        DEBUG_PRINT_ERROR("unsecureDisplay(%d) display.qservice unavailable", mode);
9256fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George    return 0;
9257fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George}
925857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George
925957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::update_color_format(OMX_COLOR_FORMATTYPE eColorFormat)
926057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George{
926157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
926257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   OMX_ERRORTYPE eRet = OMX_ErrorNone;
926357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   enum vdec_output_fromat op_format;
926457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   if(eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
926557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George     op_format = VDEC_YUV_FORMAT_NV12;
926657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   else if(eColorFormat ==
926757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka ||
926857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George           eColorFormat == OMX_COLOR_FormatYUV420Planar)
926957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      op_format = VDEC_YUV_FORMAT_TILE_4x2;
927057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   else
927157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      eRet = OMX_ErrorBadParameter;
927257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George
927357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   if(eRet == OMX_ErrorNone && drv_ctx.output_format != op_format) {
927457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      /*Set the output format*/
927557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      drv_ctx.output_format = op_format;
927657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      ioctl_msg.in = &drv_ctx.output_format;
927757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      ioctl_msg.out = NULL;
927857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_OUTPUT_FORMAT,
927957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George              (void*)&ioctl_msg) < 0) {
928057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George        DEBUG_PRINT_ERROR("\n Set output format failed for %u with err %s",
928157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George                          eColorFormat, strerror(errno));
928257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George        eRet = OMX_ErrorUnsupportedSetting;
928357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      }
928457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      else
928557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George         eRet = get_buffer_req(&drv_ctx.op_buf);
928657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   }
928757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   if (eRet == OMX_ErrorNone){
928857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      if (!client_buffers.set_color_format(eColorFormat)) {
928957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          DEBUG_PRINT_ERROR("\n Set color format failed for %u", eColorFormat);
929057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George          eRet = OMX_ErrorBadParameter;
929157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George       }
929257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George    }
929357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   if (!client_buffers.update_buffer_req()) {
929457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      DEBUG_PRINT_ERROR("\n Update bufreq in color format failed for %u", eColorFormat);
929557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George      eRet = OMX_ErrorBadParameter;
929657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   }
929757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George   return eRet;
929857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George}
9299