1e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (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.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * 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    An Open max test application ....
30e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*/
31e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
32e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <stdio.h>
33e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <string.h>
34e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <stdlib.h>
35e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <unistd.h>
36e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <fcntl.h>
37e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <sys/types.h>
38e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <sys/mman.h>
39e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <time.h>
40e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <sys/ioctl.h>
41e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <errno.h>
42e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <pthread.h>
43e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <semaphore.h>
44e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "OMX_QCOMExtns.h"
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/time.h>
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
48e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <binder/MemoryHeapBase.h>
49e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
50e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyextern "C"{
51e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include<utils/Log.h>
52e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
53dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define LOG_TAG "OMX-VDEC-TEST"
54e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_ERROR ALOGE
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#define __DEBUG_DIVX__ // Define this macro to print (through logcat)
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         // the kind of frames packed per buffer and
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         // timestamps adjustments for divx.
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#define TEST_TS_FROM_SEI // Define this macro to calculate the timestamps
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           // from the SEI and VUI data for H264
63e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
64e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#else
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <glib.h>
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define strlcpy g_strlcpy
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
69e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT printf
70e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT_ERROR printf
71e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif /* _ANDROID_ */
72e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
73e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "OMX_Core.h"
74e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "OMX_Component.h"
75e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "OMX_QCOMExtns.h"
76e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyextern "C" {
77e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "queue.h"
78e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
79e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <inttypes.h>
81e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <linux/msm_mdp.h>
82e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <linux/fb.h>
83e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
84e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
85e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*              #DEFINES                            */
86e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
87e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DELAY 66
88e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define false 0
89e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define true 1
90e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VOP_START_CODE 0x000001B6
91e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define SHORT_HEADER_START_CODE 0x00008000
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG2_FRAME_START_CODE 0x00000100
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG2_SEQ_START_CODE 0x000001B3
94e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_START_CODE  0x00000100
95e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_FRAME_START_CODE  0x0000010D
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_FRAME_FIELD_CODE  0x0000010C
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQUENCE_START_CODE 0x0000010F
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ENTRY_POINT_START_CODE 0x0000010E
99e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define NUMBER_OF_ARBITRARYBYTES_READ  (4 * 1024)
100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SEQ_LAYER_SIZE_WITHOUT_STRUCTC 32
101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SEQ_LAYER_SIZE_V1_WITHOUT_STRUCTC 16
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int previous_vc1_au = 0;
103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define CONFIG_VERSION_SIZE(param) \
104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\
105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    param.nSize = sizeof(param);
106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define FAILED(result) (result != OMX_ErrorNone)
108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define SUCCEEDED(result) (result == OMX_ErrorNone)
110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define SWAPBYTES(ptrA, ptrB) { char t = *ptrA; *ptrA = *ptrB; *ptrB = t;}
111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define SIZE_NAL_FIELD_MAX  4
112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define MDP_DEINTERLACE 0x80000000
113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ALLOCATE_BUFFER 0
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PMEM_DEVICE "/dev/pmem_adsp"
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P_EBI
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PMEM_DEVICE "/dev/pmem_adsp"
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define PMEM_DEVICE "/dev/pmem_smipool"
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#define USE_EXTERN_PMEM_BUF
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*              GLOBAL DECLARATIONS                     */
128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyusing namespace android;
131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytypedef enum {
134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  CODEC_FORMAT_H264 = 1,
135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  CODEC_FORMAT_MP4,
136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  CODEC_FORMAT_H263,
137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  CODEC_FORMAT_VC1,
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  CODEC_FORMAT_DIVX,
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  CODEC_FORMAT_MPEG2,
140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  CODEC_FORMAT_MAX = CODEC_FORMAT_MPEG2
141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} codec_format;
142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytypedef enum {
144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_DAT_PER_AU = 1,
145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_ARBITRARY_BYTES,
146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_COMMON_CODEC_MAX,
147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_START_OF_H264_SPECIFIC = 10,
149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_264_NAL_SIZE_LENGTH = FILE_TYPE_START_OF_H264_SPECIFIC,
150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_START_OF_MP4_SPECIFIC = 20,
152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_PICTURE_START_CODE = FILE_TYPE_START_OF_MP4_SPECIFIC,
153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_START_OF_VC1_SPECIFIC = 30,
155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FILE_TYPE_RCV = FILE_TYPE_START_OF_VC1_SPECIFIC,
156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  FILE_TYPE_VC1,
157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  FILE_TYPE_START_OF_DIVX_SPECIFIC = 40,
159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  FILE_TYPE_DIVX_4_5_6 = FILE_TYPE_START_OF_DIVX_SPECIFIC,
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  FILE_TYPE_DIVX_311,
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  FILE_TYPE_START_OF_MPEG2_SPECIFIC = 50,
163dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  FILE_TYPE_MPEG2_START_CODE = FILE_TYPE_START_OF_MPEG2_SPECIFIC
164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} file_type;
166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytypedef enum {
168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  GOOD_STATE = 0,
169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  PORT_SETTING_CHANGE_STATE,
170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ERROR_STATE
171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} test_status;
172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytypedef enum {
174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FREE_HANDLE_AT_LOADED = 1,
175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FREE_HANDLE_AT_IDLE,
176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FREE_HANDLE_AT_EXECUTING,
177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  FREE_HANDLE_AT_PAUSE
178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} freeHandle_test;
179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstruct temp_egl {
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int pmem_fd;
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int offset;
183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int (*Read_Buffer)(OMX_BUFFERHEADERTYPE  *pBufHdr );
186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint inputBufferFileFd;
188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
189e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFILE * outputBufferFile;
190e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFILE * seqFile;
191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint takeYuvLog = 0;
192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint displayYuv = 0;
193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint displayWindow = 0;
194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint realtime_display = 0;
195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
196e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyQueue *etb_queue = NULL;
197e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyQueue *fbd_queue = NULL;
198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_t ebd_thread_id;
200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_t fbd_thread_id;
201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* ebd_thread(void*);
202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* fbd_thread(void*);
203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_mutex_t etb_lock;
205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_mutex_t fbd_lock;
206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_mutex_t lock;
207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_cond_t cond;
208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_mutex_t eos_lock;
209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypthread_cond_t eos_cond;
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevpthread_mutex_t enable_lock;
211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellysem_t etb_sem;
213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellysem_t fbd_sem;
214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellysem_t seq_sem;
215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellysem_t in_flush_sem, out_flush_sem;
216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
217e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_PARAM_PORTDEFINITIONTYPE portFmt;
218e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_PORT_PARAM_TYPE portParam;
219e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE error;
220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_COLOR_FORMATTYPE color_fmt;
221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic bool input_use_buffer = false,output_use_buffer = false;
222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevQOMX_VIDEO_DECODER_PICTURE_ORDER picture_order;
223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned int color_fmt_type = 1;
226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned int color_fmt_type = 0;
228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define CLR_KEY  0xe8fd
231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define COLOR_BLACK_RGBA_8888 0x00000000
232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define FRAMEBUFFER_32
233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int fb_fd = -1;
235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic struct fb_var_screeninfo vinfo;
236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic struct fb_fix_screeninfo finfo;
237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic struct mdp_overlay overlay, *overlayp;
238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic struct msmfb_overlay_data ov_front;
239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int vid_buf_front_id;
240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic char tempbuf[16];
241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint overlay_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr);
242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid overlay_set();
243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid overlay_unset();
244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr);
245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint disable_output_port();
246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint enable_output_port();
247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint output_port_reconfig();
248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid free_output_buffers();
249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint open_display();
250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid close_display();
251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*              GLOBAL INIT                 */
253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint input_buf_cnt = 0;
255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint height =0, width =0;
256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint sliceheight = 0, stride = 0;
257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint used_ip_buf_cnt = 0;
258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned free_op_buf_cnt = 0;
259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvolatile int event_is_done = 0;
260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint ebd_cnt= 0, fbd_cnt = 0;
261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint bInputEosReached = 0;
262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint bOutputEosReached = 0;
263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellychar in_filename[512];
264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellychar seq_file_name[512];
265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned char seq_enabled = 0;
266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool anti_flickering = true;
267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned char flush_input_progress = 0, flush_output_progress = 0;
268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned cmd_data = ~(unsigned)0, etb_count = 0;
269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellychar curr_seq_command[100];
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_S64 timeStampLfile = 0;
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint fps = 30;
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned int timestampInterval = 33333;
274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellycodec_format  codec_format_option;
275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyfile_type     file_type_option;
276e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyfreeHandle_test freeHandle_option;
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint nalSize = 0;
278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint sent_disabled = 0;
279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint waitForPortSettingsChanged = 1;
280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellytest_status currentStatus = GOOD_STATE;
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstruct timeval t_start = {0, 0}, t_end = {0, 0};
282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//* OMX Spec Version supported by the wrappers. Version = 1.1 */
284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyconst OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101;
285e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_COMPONENTTYPE* dec_handle = 0;
286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
287e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_BUFFERHEADERTYPE  **pInputBufHdrs = NULL;
288e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_BUFFERHEADERTYPE  **pOutYUVBufHdrs= NULL;
289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic OMX_BOOL use_external_pmem_buf = OMX_FALSE;
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint rcv_v1=0;
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic struct temp_egl **p_eglHeaders = NULL;
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic unsigned use_buf_virt_addr[32];
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList = NULL;
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry = NULL;
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int bHdrflag = 0;
302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* Performance related variable*/
304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//QPERF_INIT(render_fb);
305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//QPERF_INIT(client_decode);
306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*              GLOBAL FUNC DECL                        */
309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/************************************************************************/
310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint Init_Decoder();
311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint Play_Decoder();
312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint run_tests();
313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/**************************************************************************/
315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*              STATIC DECLARATIONS                       */
316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/**************************************************************************/
317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int video_playback_count = 1;
318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int open_video_file ();
319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_DAT_File(OMX_BUFFERHEADERTYPE  *pBufHdr );
320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_ArbitraryBytes(OMX_BUFFERHEADERTYPE  *pBufHdr);
321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_Vop_Start_Code_File(OMX_BUFFERHEADERTYPE  *pBufHdr);
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int Read_Buffer_From_Mpeg2_Start_Code(OMX_BUFFERHEADERTYPE  *pBufHdr);
323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_Size_Nal(OMX_BUFFERHEADERTYPE  *pBufHdr);
324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_RCV_File_Seq_Layer(OMX_BUFFERHEADERTYPE  *pBufHdr);
325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_RCV_File(OMX_BUFFERHEADERTYPE  *pBufHdr);
326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_VC1_File(OMX_BUFFERHEADERTYPE  *pBufHdr);
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int Read_Buffer_From_DivX_4_5_6_File(OMX_BUFFERHEADERTYPE  *pBufHdr);
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int Read_Buffer_From_DivX_311_File(OMX_BUFFERHEADERTYPE  *pBufHdr);
329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *dec_handle,
331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_BUFFERHEADERTYPE  ***pBufHdrs,
332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_U32 nPortIndex,
333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       long bufCntMin, long bufSize);
334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic OMX_ERRORTYPE use_input_buffer(OMX_COMPONENTTYPE      *dec_handle,
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_BUFFERHEADERTYPE ***bufferHdr,
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_U32              nPortIndex,
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_U32              bufSize,
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                long                 bufcnt);
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic OMX_ERRORTYPE use_output_buffer(OMX_COMPONENTTYPE      *dec_handle,
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_BUFFERHEADERTYPE ***bufferHdr,
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_U32              nPortIndex,
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_U32              bufSize,
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                long                 bufcnt);
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic OMX_ERRORTYPE use_output_buffer_multiple_fd(OMX_COMPONENTTYPE      *dec_handle,
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   OMX_BUFFERHEADERTYPE ***bufferHdr,
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   OMX_U32              nPortIndex,
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   OMX_U32              bufSize,
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                   long                 bufcnt);
352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_IN OMX_PTR pAppData,
355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_IN OMX_EVENTTYPE eEvent,
356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  OMX_IN OMX_PTR pEventData);
358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_PTR pAppData,
360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic OMX_ERRORTYPE FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,
362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    OMX_OUT OMX_PTR pAppData,
363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic void do_freeHandle_and_clean_up(bool isDueToError);
366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 alignment);
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid getFreePmem();
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic  int clip2(int x)
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        x = x -1;
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        x = x | x >> 1;
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        x = x | x >> 2;
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        x = x | x >> 4;
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        x = x | x >> 16;
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        x = x + 1;
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return x;
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid wait_for_event(void)
383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Waiting for event\n");
385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&lock);
386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    while (event_is_done == 0) {
387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pthread_cond_wait(&cond, &lock);
388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    event_is_done = 0;
390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&lock);
391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Running .... get the event\n");
392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid event_complete(void )
395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&lock);
397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (event_is_done == 0) {
398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        event_is_done = 1;
399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pthread_cond_broadcast(&cond);
400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&lock);
402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint get_next_command(FILE *seq_file)
404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int i = -1;
406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    do{
407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        i++;
408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(fread(&curr_seq_command[i], 1, 1, seq_file) != 1)
409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            return -1;
410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }while(curr_seq_command[i] != '\n');
411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    curr_seq_command[i] = 0;
412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    printf("\n cmd_str = %s", curr_seq_command);
413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return 0;
414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint process_current_command(const char *seq_command)
417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char *data_str = NULL;
419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int data = 0, bufCnt = 0, i = 0;
420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int frameSize;
421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(strstr(seq_command, "pause") == seq_command)
423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n\n $$$$$   PAUSE    $$$$$");
425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        data_str = (char*)seq_command + strlen("pause") + 1;
426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        data = atoi(data_str);
427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n After frame number %u", data);
428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        cmd_data = data;
429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        sem_wait(&seq_sem);
430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!bOutputEosReached && !bInputEosReached)
431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n Sending PAUSE cmd to OMX compt");
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StatePause,0);
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            wait_for_event();
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n EventHandler for PAUSE DONE");
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            seq_enabled = 0;
439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(strstr(seq_command, "sleep") == seq_command)
441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n\n $$$$$   SLEEP    $$$$$");
443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        data_str = (char*)seq_command + strlen("sleep") + 1;
444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        data = atoi(data_str);
445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n Sleep Time = %u ms", data);
446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        usleep(data*1000);
447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(strstr(seq_command, "resume") == seq_command)
449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n\n $$$$$   RESUME    $$$$$");
451090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly        printf("\n Immediate effect");
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n Sending RESUME cmd to OMX compt");
453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateExecuting,0);
454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        wait_for_event();
455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n EventHandler for RESUME DONE");
456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if(strstr(seq_command, "flush") == seq_command)
458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n\n $$$$$   FLUSH    $$$$$");
460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        data_str = (char*)seq_command + strlen("flush") + 1;
461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        data = atoi(data_str);
462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n After frame number %u", data);
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (previous_vc1_au)
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n Flush not allowed on Field boundary");
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return 0;
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        cmd_data = data;
469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        sem_wait(&seq_sem);
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!bOutputEosReached && !bInputEosReached)
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n Sending FLUSH cmd to OMX compt");
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            flush_input_progress = 1;
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            flush_output_progress = 1;
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_SendCommand(dec_handle, OMX_CommandFlush, OMX_ALL, 0);
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            wait_for_event();
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n EventHandler for FLUSH DONE");
478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n Post EBD_thread flush sem");
479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            sem_post(&in_flush_sem);
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n Post FBD_thread flush sem");
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            sem_post(&out_flush_sem);
482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            seq_enabled = 0;
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(strstr(seq_command, "disable_op") == seq_command)
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n\n $$$$$   DISABLE OP PORT    $$$$$");
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        data_str = (char*)seq_command + strlen("disable_op") + 1;
490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        data = atoi(data_str);
491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n After frame number %u", data);
492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        cmd_data = data;
493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        sem_wait(&seq_sem);
494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n Sending DISABLE OP cmd to OMX compt");
495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (disable_output_port() != 0)
496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n ERROR: While DISABLE OP...");
498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            do_freeHandle_and_clean_up(true);
499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return -1;
500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n EventHandler for DISABLE OP");
503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(strstr(seq_command, "enable_op") == seq_command)
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n\n $$$$$   ENABLE OP PORT    $$$$$");
507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        data_str = (char*)seq_command + strlen("enable_op") + 1;
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n Sending ENABLE OP cmd to OMX compt");
509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (enable_output_port() != 0)
510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n ERROR: While ENABLE OP...");
512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            do_freeHandle_and_clean_up(true);
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return -1;
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\n EventHandler for ENABLE OP");
517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n\n $$$$$   INVALID CMD    $$$$$");
521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("\n seq_command[%s] is invalid", seq_command);
522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        seq_enabled = 0;
523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return 0;
525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid PrintFramePackArrangement(OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement)
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("id (%d)\n",
530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.id);
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("cancel_flag (%d)\n",
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.cancel_flag);
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("type (%d)\n",
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.type);
535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("quincunx_sampling_flag (%d)\n",
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.quincunx_sampling_flag);
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("content_interpretation_type (%d)\n",
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.content_interpretation_type);
539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("spatial_flipping_flag (%d)\n",
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.spatial_flipping_flag);
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_flipped_flag (%d)\n",
542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_flipped_flag);
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("field_views_flag (%d)\n",
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.field_views_flag);
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("current_frame_is_frame0_flag (%d)\n",
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.current_frame_is_frame0_flag);
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_self_contained_flag (%d)\n",
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_self_contained_flag);
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame1_self_contained_flag (%d)\n",
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame1_self_contained_flag);
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_grid_position_x (%d)\n",
552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_grid_position_x);
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_grid_position_y (%d)\n",
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_grid_position_y);
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame1_grid_position_x (%d)\n",
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame1_grid_position_x);
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame1_grid_position_y (%d)\n",
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame1_grid_position_y);
559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("reserved_byte (%d)\n",
560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.reserved_byte);
561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("repetition_period (%d)\n",
562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.repetition_period);
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("extension_flag (%d)\n",
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.extension_flag);
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* ebd_thread(void* pArg)
567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(currentStatus != ERROR_STATE)
569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int readBytes =0;
571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE* pBuffer = NULL;
572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(flush_input_progress)
574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n EBD_thread flush wait start");
576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        sem_wait(&in_flush_sem);
577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n EBD_thread flush wait complete");
578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_wait(&etb_sem);
581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&etb_lock);
582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBuffer = (OMX_BUFFERHEADERTYPE *) pop(etb_queue);
583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&etb_lock);
584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(pBuffer == NULL)
585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error - No etb pBuffer to dequeue\n");
587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      continue;
588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
589dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBuffer->nOffset = 0;
591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if((readBytes = Read_Buffer(pBuffer)) > 0) {
592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pBuffer->nFilledLen = readBytes;
593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_EmptyThisBuffer(dec_handle,pBuffer);
595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        etb_count++;
596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bInputEosReached = true;
601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pBuffer->nFilledLen = readBytes;
602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_EmptyThisBuffer(dec_handle,pBuffer);
604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("EBD::Either EOS or Some Error while reading file\n");
605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        etb_count++;
606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return NULL;
610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* fbd_thread(void* pArg)
613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  long unsigned act_time = 0, display_time = 0, render_time = 5e3, lipsync = 15e3;
615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct timeval t_avsync = {0, 0}, base_avsync = {0, 0};
616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  float total_time = 0;
617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int canDisplay = 1, contigous_drop_frame = 0, bytes_written = 0, ret = 0;
618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_S64 base_timestamp = 0, lastTimestamp = 0;
619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_BUFFERHEADERTYPE *pBuffer = NULL, *pPrevBuff = NULL;
620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&eos_lock);
621dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("First Inside %s\n", __FUNCTION__);
623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(currentStatus != ERROR_STATE && !bOutputEosReached)
624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&eos_lock);
626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Inside %s\n", __FUNCTION__);
627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(flush_output_progress)
628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n FBD_thread flush wait start");
630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        sem_wait(&out_flush_sem);
631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n FBD_thread flush wait complete");
632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_wait(&fbd_sem);
634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&enable_lock);
635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (sent_disabled)
636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pthread_mutex_unlock(&enable_lock);
638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pthread_mutex_lock(&fbd_lock);
639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (free_op_buf_cnt == portFmt.nBufferCountActual)
640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free_output_buffers();
641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pthread_mutex_unlock(&fbd_lock);
642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pthread_mutex_lock(&eos_lock);
643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      continue;
644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&enable_lock);
646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (anti_flickering)
647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPrevBuff = pBuffer;
648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&fbd_lock);
649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&fbd_lock);
651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (pBuffer == NULL)
652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (anti_flickering)
654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pBuffer = pPrevBuff;
655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("Error - No pBuffer to dequeue\n");
656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pthread_mutex_lock(&eos_lock);
657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      continue;
658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (pBuffer->nFilledLen > 0)
660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!fbd_cnt)
662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            gettimeofday(&t_start, NULL);
664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fbd_cnt++;
666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("%s: fbd_cnt(%d) Buf(%p) Timestamp(%lld)",
667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        __FUNCTION__, fbd_cnt, pBuffer, pBuffer->nTimeStamp);
668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      canDisplay = 1;
669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (realtime_display)
670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pBuffer->nTimeStamp != (lastTimestamp + timestampInterval))
672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("Unexpected timestamp[%lld]! Expected[%lld]\n",
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pBuffer->nTimeStamp, lastTimestamp + timestampInterval);
675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        lastTimestamp = pBuffer->nTimeStamp;
677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        gettimeofday(&t_avsync, NULL);
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!base_avsync.tv_sec && !base_avsync.tv_usec)
679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          display_time = 0;
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          base_avsync = t_avsync;
682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          base_timestamp = pBuffer->nTimeStamp;
683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("base_avsync Sec(%lu) uSec(%lu) base_timestamp(%lld)",
684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              base_avsync.tv_sec, base_avsync.tv_usec, base_timestamp);
685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          act_time = (t_avsync.tv_sec - base_avsync.tv_sec) * 1e6
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     + t_avsync.tv_usec - base_avsync.tv_usec;
690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          display_time = pBuffer->nTimeStamp - base_timestamp;
691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("%s: act_time(%lu) display_time(%lu)",
692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              __FUNCTION__, act_time, display_time);
693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               //Frame rcvd on time
694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (((act_time + render_time) >= (display_time - lipsync) &&
695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               (act_time + render_time) <= (display_time + lipsync)) ||
696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               //Display late frame
697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               (contigous_drop_frame > 5))
698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              display_time = 0;
699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if ((act_time + render_time) < (display_time - lipsync))
700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              //Delaying early frame
701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              display_time -= (lipsync + act_time + render_time);
702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              //Dropping late frame
705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              canDisplay = 0;
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              contigous_drop_frame++;
707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (displayYuv && canDisplay)
711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (display_time)
713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              usleep(display_time);
714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          ret = overlay_fb(pBuffer);
715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (ret != 0)
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("\nERROR in overlay_fb, disabling display!");
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            close_display();
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            displayYuv = 0;
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          usleep(render_time);
722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          contigous_drop_frame = 0;
723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (takeYuvLog)
726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
727dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          bytes_written = fwrite((const char *)pBuffer->pBuffer,
728dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                  pBuffer->nFilledLen,1,outputBufferFile);
729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (bytes_written < 0) {
730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT("\nFillBufferDone: Failed to write to the file\n");
731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else {
733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT("\nFillBufferDone: Wrote %d YUV bytes to the file\n",
734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            bytes_written);
735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pBuffer->nFlags & OMX_BUFFERFLAG_EXTRADATA)
738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_OTHER_EXTRADATATYPE *pExtra;
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT(">> BUFFER WITH EXTRA DATA RCVD <<<");
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pExtra = (OMX_OTHER_EXTRADATATYPE *)
742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 ((unsigned)(pBuffer->pBuffer + pBuffer->nOffset +
743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pBuffer->nFilledLen + 3)&(~3));
744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        while(pExtra &&
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              (OMX_U8*)pExtra < (pBuffer->pBuffer + pBuffer->nAllocLen) &&
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pExtra->eType != OMX_ExtraDataNone )
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("ExtraData : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pBuffer, pBuffer->nTimeStamp, pExtra->eType, pExtra->nDataSize);
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          switch (pExtra->eType)
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            case OMX_ExtraDataInterlaceFormat:
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_STREAMINTERLACEFORMAT *pInterlaceFormat = (OMX_STREAMINTERLACEFORMAT *)pExtra->data;
755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT("OMX_ExtraDataInterlaceFormat: Buf(%p) TSmp(%lld) IntPtr(%p) Fmt(%x)",
756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pBuffer->pBuffer, pBuffer->nTimeStamp,
757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pInterlaceFormat, pInterlaceFormat->nInterlaceFormats);
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            case OMX_ExtraDataFrameInfo:
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)pExtra->data;
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT("OMX_ExtraDataFrameInfo: Buf(%p) TSmp(%lld) PicType(%u) IntT(%u) ConMB(%u)",
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pBuffer->pBuffer, pBuffer->nTimeStamp, frame_info->ePicType,
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                frame_info->interlaceType, frame_info->nConcealedMacroblocks);
766dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) ",
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
768dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                frame_info->aspectRatio.aspectRatioY);
769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT("PANSCAN numWindows(%d)", frame_info->panScan.numWindows);
770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              for (int i = 0; i < frame_info->panScan.numWindows; i++)
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT("WINDOW Lft(%d) Tp(%d) Rgt(%d) Bttm(%d)",
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  frame_info->panScan.window[i].x,
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  frame_info->panScan.window[i].y,
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  frame_info->panScan.window[i].dx,
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  frame_info->panScan.window[i].dy);
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            case OMX_ExtraDataConcealMB:
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_U32 concealMBnum = 0, bytes_cnt = 0;
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              while (bytes_cnt < pExtra->nDataSize)
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                data = *data_ptr;
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                while (data)
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  concealMBnum += (data&0x01);
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  data >>= 1;
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                data_ptr++;
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bytes_cnt++;
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT("OMX_ExtraDataConcealMB: Buf(%p) TSmp(%lld) ConcealMB(%u)",
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pBuffer->pBuffer, pBuffer->nTimeStamp, concealMBnum);
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            default:
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Unknown Extrata!");
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (pExtra->nSize < (pBuffer->nAllocLen - (OMX_U32)pExtra))
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) pExtra) + pExtra->nSize);
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR: Extradata pointer overflow buffer(%p) extra(%p)",
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pBuffer, pExtra);
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pExtra = NULL;
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(pBuffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n");
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("***************************************************\n");
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("FillBufferDone: End Of Sequence Received\n");
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("***************************************************\n");
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(pBuffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("\n");
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("***************************************************\n");
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("***************************************************\n");
827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /********************************************************************/
829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* De-Initializing the open max and relasing the buffers and */
830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* closing the files.*/
831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /********************************************************************/
832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS )
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_GetConfig(dec_handle,
836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    &framePackingArrangement);
838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      PrintFramePackArrangement(framePackingArrangement);
839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      gettimeofday(&t_end, NULL);
841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      total_time = ((float) ((t_end.tv_sec - t_start.tv_sec) * 1e6
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     + t_end.tv_usec - t_start.tv_usec))/ 1e6;
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //total frames is fbd_cnt - 1 since the start time is
844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //recorded after the first frame is decoded.
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf("\nAvg decoding frame rate=%f\n", (fbd_cnt - 1)/total_time);
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("***************************************************\n");
848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("FillBufferDone: End Of Stream Reached\n");
849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("***************************************************\n");
850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pthread_mutex_lock(&eos_lock);
851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      bOutputEosReached = true;
852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&enable_lock);
856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (flush_output_progress || sent_disabled)
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pBuffer->nFilledLen = 0;
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pBuffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pthread_mutex_lock(&fbd_lock);
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if ( pPrevBuff != NULL ) {
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            push(fbd_queue, (void *)pPrevBuff);
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pPrevBuff = NULL;
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(push(fbd_queue, (void *)pBuffer) < 0)
866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sem_post(&fbd_sem);
871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pthread_mutex_unlock(&fbd_lock);
872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!anti_flickering)
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pPrevBuff = pBuffer;
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pPrevBuff)
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pthread_mutex_lock(&fbd_lock);
880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pthread_mutex_lock(&eos_lock);
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (!bOutputEosReached)
882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if ( OMX_FillThisBuffer(dec_handle, pPrevBuff) == OMX_ErrorNone ) {
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  free_op_buf_cnt--;
885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pthread_mutex_unlock(&eos_lock);
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pthread_mutex_unlock(&fbd_lock);
889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&enable_lock);
892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(cmd_data <= fbd_cnt)
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sem_post(&seq_sem);
895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf("\n Posted seq_sem Frm(%d) Req(%d)", fbd_cnt, cmd_data);
896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      cmd_data = ~(unsigned)0;
897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&eos_lock);
899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(seq_enabled)
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      seq_enabled = 0;
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sem_post(&seq_sem);
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf("\n Posted seq_sem in EOS \n");
905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_cond_broadcast(&eos_cond);
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&eos_lock);
908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return NULL;
909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
911e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_IN OMX_PTR pAppData,
913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_IN OMX_EVENTTYPE eEvent,
914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                           OMX_IN OMX_PTR pEventData)
916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Function %s \n", __FUNCTION__);
918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch(eEvent) {
920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_EventCmdComplete:
921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT("\n OMX_EventCmdComplete \n");
922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if(OMX_CommandPortDisable == (OMX_COMMANDTYPE)nData1)
923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT("*********************************************\n");
925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT("Recieved DISABLE Event Command Complete[%d]\n",nData2);
926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT("*********************************************\n");
927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            else if(OMX_CommandPortEnable == (OMX_COMMANDTYPE)nData1)
929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT("*********************************************\n");
931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT("Recieved ENABLE Event Command Complete[%d]\n",nData2);
932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT("*********************************************\n");
933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (currentStatus == PORT_SETTING_CHANGE_STATE)
934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  currentStatus = GOOD_STATE;
935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pthread_mutex_lock(&enable_lock);
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                sent_disabled = 0;
937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pthread_mutex_unlock(&enable_lock);
938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else if(OMX_CommandFlush == (OMX_COMMANDTYPE)nData1)
940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT("*********************************************\n");
942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT("Received FLUSH Event Command Complete[%d]\n",nData2);
943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT("*********************************************\n");
944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (nData2 == 0)
945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    flush_input_progress = 0;
946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                else if (nData2 == 1)
947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    flush_output_progress = 0;
948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (!flush_input_progress && !flush_output_progress)
950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                event_complete();
951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_EventError:
954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("*********************************************\n");
955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("Received OMX_EventError Event Command !\n");
956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            printf("*********************************************\n");
957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            currentStatus = ERROR_STATE;
958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            if (OMX_ErrorInvalidState == (OMX_ERRORTYPE)nData1 ||
959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                OMX_ErrorHardware == (OMX_ERRORTYPE)nData1)
960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            {
961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              printf("Invalid State or hardware error \n");
962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              if(event_is_done == 0)
963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              {
964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DEBUG_PRINT("Event error in the middle of Decode \n");
965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pthread_mutex_lock(&eos_lock);
966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bOutputEosReached = true;
967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                pthread_mutex_unlock(&eos_lock);
968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(seq_enabled)
969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    seq_enabled = 0;
971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    sem_post(&seq_sem);
972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    printf("\n Posted seq_sem in ERROR");
973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              }
975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (waitForPortSettingsChanged)
977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	            waitForPortSettingsChanged = 0;
979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	            event_complete();
980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        case OMX_EventPortSettingsChanged:
983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("OMX_EventPortSettingsChanged port[%d]\n", nData1);
984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            currentStatus = PORT_SETTING_CHANGE_STATE;
985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (waitForPortSettingsChanged)
986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	            waitForPortSettingsChanged = 0;
988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	            event_complete();
989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pthread_mutex_lock(&eos_lock);
993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pthread_cond_broadcast(&eos_cond);
994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pthread_mutex_unlock(&eos_lock);
995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_EventBufferFlag:
999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("OMX_EventBufferFlag port[%d] flags[%x]\n", nData1, nData2);
1000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (nData1 == 1 && (nData2 & OMX_BUFFERFLAG_EOS)) {
1001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pthread_mutex_lock(&eos_lock);
1002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                bOutputEosReached = true;
1003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pthread_mutex_unlock(&eos_lock);
1004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if(seq_enabled)
1005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                {
1006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    seq_enabled = 0;
1007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    sem_post(&seq_sem);
1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    printf("\n Posted seq_sem in OMX_EventBufferFlag");
1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            else
1012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
1013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("OMX_EventBufferFlag Event not handled\n");
1014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
1016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case OMX_EventIndexsettingChanged:
1017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("OMX_EventIndexSettingChanged Interlace mode[%x]\n", nData1);
1018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
1019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        default:
1020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("ERROR - Unknown Event \n");
1021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
1022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
1024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1026e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
1027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_IN OMX_PTR pAppData,
1028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
1029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int readBytes =0; int bufCnt=0;
1031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE result;
1032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Function %s cnt[%d]\n", __FUNCTION__, ebd_cnt);
1034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    ebd_cnt++;
1035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(bInputEosReached) {
1038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("*****EBD:Input EoS Reached************\n");
1039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return OMX_ErrorNone;
1040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_lock(&etb_lock);
1043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(push(etb_queue, (void *) pBuffer) < 0)
1044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       DEBUG_PRINT_ERROR("Error in enqueue  ebd data\n");
1046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       return OMX_ErrorUndefined;
1047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_unlock(&etb_lock);
1049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_post(&etb_sem);
1050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
1052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1054e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,
1055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_OUT OMX_PTR pAppData,
1056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
1057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s callback_count[%d] \n", __FUNCTION__, fbd_cnt);
1059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Test app will assume there is a dynamic port setting
1061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     * In case that there is no dynamic port setting, OMX will not call event cb,
1062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     * instead OMX will send empty this buffer directly and we need to clear an event here
1063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     */
1064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(waitForPortSettingsChanged)
1065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      waitForPortSettingsChanged = 0;
1067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(displayYuv)
1068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlay_set();
1069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      event_complete();
1070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&fbd_lock);
1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_op_buf_cnt++;
1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(push(fbd_queue, (void *)pBuffer) < 0)
1075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pthread_mutex_unlock(&fbd_lock);
1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return OMX_ErrorUndefined;
1079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&fbd_lock);
1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_post(&fbd_sem);
1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OMX_ErrorNone;
1084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint main(int argc, char **argv)
1087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int i=0;
1089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int bufCnt=0;
1090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int num=0;
1091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int outputOption = 0;
1092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int test_option = 0;
1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int pic_order = 0;
1094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE result;
1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sliceheight = height = 144;
1096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    stride = width = 176;
1097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (argc < 2)
1099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("To use it: ./mm-vdec-omx-test <clip location> \n");
1101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Command line argument is also available\n");
1102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
1103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy(in_filename, argv[1], strlen(argv[1])+1);
1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(argc > 2)
1107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      codec_format_option = (codec_format)atoi(argv[2]);
1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // file_type, out_op, tst_op, nal_sz, disp_win, rt_dis, (fps), color, pic_order
1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int param[9] = {2, 1, 1, 0, 0, 0, 0xFF, 0xFF, 0xFF};
1111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      int next_arg = 3, idx = 0;
1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      while (argc > next_arg && idx < 9)
1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (strlen(argv[next_arg]) > 2)
1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          strlcpy(seq_file_name, argv[next_arg],strlen(argv[next_arg]) + 1);
1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          next_arg = argc;
1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          param[idx++] = atoi(argv[next_arg++]);
1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      idx = 0;
1123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      file_type_option = (file_type)param[idx++];
1124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3)
1125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        nalSize = param[idx++];
1127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (nalSize != 2 && nalSize != 4)
1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf("Error - Can't pass NAL length size = %d\n", nalSize);
1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return -1;
1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      outputOption = param[idx++];
1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      test_option = param[idx++];
1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      displayWindow = param[idx++];
1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (displayWindow > 0)
1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("Only entire display window supported! Ignoring value\n");
1138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      realtime_display = param[idx++];
1139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (realtime_display)
1140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        takeYuvLog = 0;
1142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(param[idx] != 0xFF)
1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fps = param[idx++];
1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          timestampInterval = 1e6 / fps;
1146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      color_fmt_type = (param[idx] != 0xFF)? param[idx++] : color_fmt_type;
1149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pic_order = (param[idx] != 0xFF)? param[idx++] : 0;
1150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf("Executing DynPortReconfig QCIF 144 x 176 \n");
1151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Command line argument is available\n");
1155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("To use it: ./mm-vdec-omx-test <clip location> <codec_type> \n");
1156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("           <input_type: 1. per AU(.dat), 2. arbitrary, 3.per NAL/frame>\n");
1157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("           <output_type> <test_case> <size_nal if H264>\n\n\n");
1158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
1160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 1--> H264\n");
1162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 2--> MP4\n");
1163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 3--> H263\n");
1164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 4--> VC1\n");
1165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" 5--> DivX\n");
1166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" 6--> MPEG2\n");
1167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fgets(tempbuf,sizeof(tempbuf),stdin);
1169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sscanf(tempbuf,"%d",&codec_format_option);
1170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (codec_format_option > CODEC_FORMAT_MAX)
1172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" Wrong test case...[%d] \n", codec_format_option);
1174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return -1;
1175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
1178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 1--> PER ACCESS UNIT CLIP (.dat). Clip only available for H264 and Mpeg4\n");
1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" 2--> ARBITRARY BYTES (need .264/.264c/.m4v/.263/.rcv/.vc1/.m2v)\n");
1181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (codec_format_option == CODEC_FORMAT_H264)
1182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf(" 3--> NAL LENGTH SIZE CLIP (.264c)\n");
1184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if ( (codec_format_option == CODEC_FORMAT_MP4) || (codec_format_option == CODEC_FORMAT_H263) )
1186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf(" 3--> MP4 VOP or H263 P0 SHORT HEADER START CODE CLIP (.m4v or .263)\n");
1188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if (codec_format_option == CODEC_FORMAT_VC1)
1190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf(" 3--> VC1 clip Simple/Main Profile (.rcv)\n");
1192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf(" 4--> VC1 clip Advance Profile (.vc1)\n");
1193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (codec_format_option == CODEC_FORMAT_DIVX)
1195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" 3--> DivX 4, 5, 6 clip (.cmp)\n");
1197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" 4--> DivX 3.11 clip \n");
1199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (codec_format_option == CODEC_FORMAT_MPEG2)
1202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf(" 3--> MPEG2 START CODE CLIP (.m2v)\n");
1204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1205dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fflush(stdin);
1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fgets(tempbuf,sizeof(tempbuf),stdin);
1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sscanf(tempbuf,"%d",&file_type_option);
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fflush(stdin);
1210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3)
1211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf(" Enter Nal length size [2 or 4] \n");
1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fgets(tempbuf,sizeof(tempbuf),stdin);
1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        sscanf(tempbuf,"%d",&nalSize);
1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (nalSize != 2 && nalSize != 4)
1216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf("Error - Can't pass NAL length size = %d\n", nalSize);
1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return -1;
1219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" Output buffer option:\n");
1224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 0 --> No display and no YUV log\n");
1226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 1 --> Diplay YUV\n");
1227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 2 --> Take YUV log\n");
1228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 3 --> Display YUV and take YUV log\n");
1229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fgets(tempbuf,sizeof(tempbuf),stdin);
1231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sscanf(tempbuf,"%d",&outputOption);
1232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
1236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 1 --> Play the clip till the end\n");
1238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 2 --> Run compliance test. Do NOT expect any display for most option. \n");
1239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf("       Please only see \"TEST SUCCESSFULL\" to indicate test pass\n");
1240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fgets(tempbuf,sizeof(tempbuf),stdin);
1242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sscanf(tempbuf,"%d",&test_option);
1243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (outputOption == 1 || outputOption == 3)
1246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" *********************************************\n");
1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" ENTER THE PORTION OF DISPLAY TO USE\n");
1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" *********************************************\n");
1250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" 0 --> Entire Screen\n");
1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" 1 --> 1/4 th of the screen starting from top left corner to middle \n");
1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" 2 --> 1/4 th of the screen starting from middle to top right corner \n");
1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" 3 --> 1/4 th of the screen starting from middle to bottom left \n");
1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf(" 4 --> 1/4 th of the screen starting from middle to bottom right \n");
1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf("       Please only see \"TEST SUCCESSFULL\" to indidcate test pass\n");
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fflush(stdin);
1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fgets(tempbuf,sizeof(tempbuf),stdin);
1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sscanf(tempbuf,"%d",&displayWindow);
1259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fflush(stdin);
1260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(displayWindow > 0)
1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              printf(" Curently display window 0 only supported; ignoring other values\n");
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              displayWindow = 0;
1264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (outputOption == 1 || outputOption == 3)
1268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" *********************************************\n");
1270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" DO YOU WANT TEST APP TO RENDER in Real time \n");
1271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" 0 --> NO\n 1 --> YES\n");
1272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" Warning: For H264, it require one NAL per frame clip.\n");
1273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf("          For Arbitrary bytes option, Real time display is not recommended\n");
1274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" *********************************************\n");
1275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          fflush(stdin);
1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fgets(tempbuf,sizeof(tempbuf),stdin);
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sscanf(tempbuf,"%d",&realtime_display);
1278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          fflush(stdin);
1279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (realtime_display)
1283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" *********************************************\n");
1285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" ENTER THE CLIP FPS\n");
1286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" Exception: Timestamp extracted from clips will be used.\n");
1287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf(" *********************************************\n");
1288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          fflush(stdin);
1289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          fgets(tempbuf,sizeof(tempbuf),stdin);
1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          sscanf(tempbuf,"%d",&fps);
1291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          fflush(stdin);
1292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          timestampInterval = 1000000/fps;
1293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" *********************************************\n");
1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" ENTER THE COLOR FORMAT \n");
1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" 0 --> Semiplanar \n 1 --> Tile Mode\n");
1298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fflush(stdin);
1300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fgets(tempbuf,sizeof(tempbuf),stdin);
1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sscanf(tempbuf,"%d",&color_fmt_type);
1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fflush(stdin);
1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" *********************************************\n");
1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" Output picture order option: \n");
1306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf(" 0 --> Display order\n 1 --> Decode order\n");
1308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fgets(tempbuf,sizeof(tempbuf),stdin);
1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sscanf(tempbuf,"%d",&pic_order);
1311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (file_type_option >= FILE_TYPE_COMMON_CODEC_MAX)
1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      switch (codec_format_option)
1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case CODEC_FORMAT_H264:
1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          file_type_option = (file_type)(FILE_TYPE_START_OF_H264_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
1319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case CODEC_FORMAT_DIVX:
1321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          file_type_option = (file_type)(FILE_TYPE_START_OF_DIVX_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case CODEC_FORMAT_MP4:
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case CODEC_FORMAT_H263:
1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          file_type_option = (file_type)(FILE_TYPE_START_OF_MP4_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case CODEC_FORMAT_VC1:
1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          file_type_option = (file_type)(FILE_TYPE_START_OF_VC1_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case CODEC_FORMAT_MPEG2:
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          file_type_option = (file_type)(FILE_TYPE_START_OF_MPEG2_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        default:
1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          printf("Error: Unknown code %d\n", codec_format_option);
1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    CONFIG_VERSION_SIZE(picture_order);
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    picture_order.eOutputPictureOrder = QOMX_VIDEO_DISPLAY_ORDER;
1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pic_order == 1)
1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      picture_order.eOutputPictureOrder = QOMX_VIDEO_DECODE_ORDER;
1342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (outputOption == 0)
1344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      displayYuv = 0;
1346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      takeYuvLog = 0;
1347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      realtime_display = 0;
1348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (outputOption == 1)
1350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      displayYuv = 1;
1352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (outputOption == 2)
1354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      takeYuvLog = 1;
1356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      realtime_display = 0;
1357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (outputOption == 3)
1359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      displayYuv = 1;
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      takeYuvLog = !realtime_display;
1362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf("Wrong option. Assume you want to see the YUV display\n");
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      displayYuv = 1;
1367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (test_option == 2)
1370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" ENTER THE COMPLIANCE TEST YOU WOULD LIKE TO EXECUTE\n");
1373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" *********************************************\n");
1374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 1 --> Call Free Handle at the OMX_StateLoaded\n");
1375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 2 --> Call Free Handle at the OMX_StateIdle\n");
1376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 3 --> Call Free Handle at the OMX_StateExecuting\n");
1377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf(" 4 --> Call Free Handle at the OMX_StatePause\n");
1378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fgets(tempbuf,sizeof(tempbuf),stdin);
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      sscanf(tempbuf,"%d",&freeHandle_option);
1381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fflush(stdin);
1382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      freeHandle_option = (freeHandle_test)0;
1386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    printf("Input values: inputfilename[%s]\n", in_filename);
1389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    printf("*******************************************************\n");
1390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_cond_init(&cond, 0);
1391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_cond_init(&eos_cond, 0);
1392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_init(&eos_lock, 0);
1393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_init(&lock, 0);
1394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_init(&etb_lock, 0);
1395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_init(&fbd_lock, 0);
1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_init(&enable_lock, 0);
1397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_init(&etb_sem, 0, 0))
1398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Error - sem_init failed %d\n", errno);
1400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_init(&fbd_sem, 0, 0))
1402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Error - sem_init failed %d\n", errno);
1404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_init(&seq_sem, 0, 0))
1406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Error - sem_init failed %d\n", errno);
1408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_init(&in_flush_sem, 0, 0))
1410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Error - sem_init failed %d\n", errno);
1412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_init(&out_flush_sem, 0, 0))
1414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Error - sem_init failed %d\n", errno);
1416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    etb_queue = alloc_queue();
1418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (etb_queue == NULL)
1419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("\n Error in Creating etb_queue\n");
1421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
1422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    fbd_queue = alloc_queue();
1425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (fbd_queue == NULL)
1426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("\n Error in Creating fbd_queue\n");
1428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      free_queue(etb_queue);
1429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
1430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(0 != pthread_create(&fbd_thread_id, NULL, fbd_thread, NULL))
1433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("\n Error in Creating fbd_thread \n");
1435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      free_queue(etb_queue);
1436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      free_queue(fbd_queue);
1437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
1438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (displayYuv)
1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (open_display() != 0)
1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n Error opening display! Video won't be displayed...");
1445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        displayYuv = 0;
1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    run_tests();
1450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_cond_destroy(&cond);
1451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_destroy(&lock);
1452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_destroy(&etb_lock);
1453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_destroy(&fbd_lock);
1454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_destroy(&enable_lock);
1455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_cond_destroy(&eos_cond);
1456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_destroy(&eos_lock);
1457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_destroy(&etb_sem))
1458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
1460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_destroy(&fbd_sem))
1462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
1464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_destroy(&seq_sem))
1466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
1468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_destroy(&in_flush_sem))
1470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
1472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (-1 == sem_destroy(&out_flush_sem))
1474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
1476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (displayYuv)
1478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close_display();
1479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return 0;
1480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint run_tests()
1483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int cmd_error = 0;
1485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT("Inside %s\n", __FUNCTION__);
1486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  waitForPortSettingsChanged = 1;
1487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(file_type_option == FILE_TYPE_DAT_PER_AU) {
1489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Read_Buffer = Read_Buffer_From_DAT_File;
1490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if(file_type_option == FILE_TYPE_ARBITRARY_BYTES) {
1492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Read_Buffer = Read_Buffer_ArbitraryBytes;
1493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if(codec_format_option == CODEC_FORMAT_H264) {
1495dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    Read_Buffer = Read_Buffer_From_Size_Nal;
1496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if((codec_format_option == CODEC_FORMAT_H263) ||
1498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          (codec_format_option == CODEC_FORMAT_MP4)) {
1499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Read_Buffer = Read_Buffer_From_Vop_Start_Code_File;
1500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (codec_format_option == CODEC_FORMAT_MPEG2) {
1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    Read_Buffer = Read_Buffer_From_Mpeg2_Start_Code;
1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(file_type_option == FILE_TYPE_DIVX_4_5_6) {
1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    Read_Buffer = Read_Buffer_From_DivX_4_5_6_File;
1506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(file_type_option == FILE_TYPE_DIVX_311) {
1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    Read_Buffer = Read_Buffer_From_DivX_311_File;
1510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if(file_type_option == FILE_TYPE_RCV) {
1513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Read_Buffer = Read_Buffer_From_RCV_File;
1514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  else if(file_type_option == FILE_TYPE_VC1) {
1516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Read_Buffer = Read_Buffer_From_VC1_File;
1517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  DEBUG_PRINT("file_type_option %d!\n", file_type_option);
1520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  switch(file_type_option)
1522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case FILE_TYPE_DAT_PER_AU:
1524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case FILE_TYPE_ARBITRARY_BYTES:
1525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case FILE_TYPE_264_NAL_SIZE_LENGTH:
1526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case FILE_TYPE_PICTURE_START_CODE:
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case FILE_TYPE_MPEG2_START_CODE:
1528e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case FILE_TYPE_RCV:
1529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case FILE_TYPE_VC1:
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case FILE_TYPE_DIVX_4_5_6:
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case FILE_TYPE_DIVX_311:
1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(Init_Decoder()!= 0x00)
1535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Error - Decoder Init failed\n");
1537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
1538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(Play_Decoder() != 0x00)
1540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
1542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
1544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    default:
1545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error - Invalid Entry...%d\n",file_type_option);
1546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      break;
1547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  anti_flickering = true;
1550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  if(strlen(seq_file_name))
1551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        seqFile = fopen (seq_file_name, "rb");
1553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (seqFile == NULL)
1554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error - Seq file %s could NOT be opened\n",
1556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              seq_file_name);
1557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return -1;
1558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
1560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT("Seq file %s is opened \n", seq_file_name);
1562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            seq_enabled = 1;
1563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            anti_flickering = false;
1564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_lock(&eos_lock);
1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (bOutputEosReached == false && cmd_error == 0)
1569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
1570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(seq_enabled)
1571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pthread_mutex_unlock(&eos_lock);
1573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(!get_next_command(seqFile))
1574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            cmd_error = process_current_command(curr_seq_command);
1575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
1576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
1577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            printf("\n Error in get_next_cmd or EOF");
1578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            seq_enabled = 0;
1579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pthread_mutex_lock(&eos_lock);
1581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pthread_cond_wait(&eos_cond, &eos_lock);
1584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (currentStatus == PORT_SETTING_CHANGE_STATE)
1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pthread_mutex_unlock(&eos_lock);
1588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      cmd_error = output_port_reconfig();
1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pthread_mutex_lock(&eos_lock);
1590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
1592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  pthread_mutex_unlock(&eos_lock);
1593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  // Wait till EOS is reached...
1595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(bOutputEosReached)
1596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    do_freeHandle_and_clean_up(currentStatus == ERROR_STATE);
1597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  return 0;
1598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint Init_Decoder()
1601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
1603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE omxresult;
1604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U32 total = 0;
1605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char vdecCompNames[50];
1606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    typedef OMX_U8* OMX_U8_PTR;
1607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *role ="video_decoder";
1608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    static OMX_CALLBACKTYPE call_back = {&EventHandler, &EmptyBufferDone, &FillBufferDone};
1610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int i = 0;
1612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    long bufCnt = 0;
1613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Init. the OpenMAX Core */
1615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("\nInitializing OpenMAX Core....\n");
1616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxresult = OMX_Init();
1617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(OMX_ErrorNone != omxresult) {
1619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\n Failed to Init OpenMAX core");
1620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
1621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else {
1623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\nOpenMAX Core Init Done\n");
1624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Query for video decoders*/
1627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_GetComponentsOfRole(role, &total, 0);
1628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("\nTotal components of role=%s :%d", role, total);
1629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(total)
1631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        /* Allocate memory for pointers to component name */
1633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_U8** vidCompNames = (OMX_U8**)malloc((sizeof(OMX_U8*))*total);
1634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (vidCompNames == NULL) {
1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nFailed to allocate vidCompNames\n");
1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return -1;
1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        for (i = 0; i < total; ++i) {
1640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            vidCompNames[i] = (OMX_U8*)malloc(sizeof(OMX_U8)*OMX_MAX_STRINGNAME_SIZE);
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (vidCompNames[i] == NULL) {
1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nFailed to allocate vidCompNames[%d]\n", i);
1643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return -1;
1644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_GetComponentsOfRole(role, &total, vidCompNames);
1647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("\nComponents of Role:%s\n", role);
1648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        for (i = 0; i < total; ++i) {
1649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT("\nComponent Name [%s]\n",vidCompNames[i]);
1650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            free(vidCompNames[i]);
1651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
1652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        free(vidCompNames);
1653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else {
1655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("No components found with Role:%s", role);
1656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (codec_format_option == CODEC_FORMAT_H264)
1659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.avc", 27);
1661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //strlcpy(vdecCompNames, "OMX.SEC.qcom.video.decoder.avc", 31);
1662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (codec_format_option == CODEC_FORMAT_MP4)
1664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg4", 29);
1666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (codec_format_option == CODEC_FORMAT_H263)
1668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.h263", 28);
1670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (codec_format_option == CODEC_FORMAT_VC1)
1672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.vc1", 27);
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (codec_format_option == CODEC_FORMAT_MPEG2)
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg2", 29);
1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (file_type_option == FILE_TYPE_RCV)
1680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.wmv", 27);
1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (file_type_option == FILE_TYPE_DIVX_4_5_6)
1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx", 28);
1686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (file_type_option == FILE_TYPE_DIVX_311)
1689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx311", 31);
1691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
1696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
1697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&dec_handle),
1700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              (OMX_STRING)vdecCompNames, NULL, &call_back);
1701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (FAILED(omxresult)) {
1702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\nFailed to Load the component:%s\n", vdecCompNames);
1703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
1704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("\nComponent %s is in LOADED state\n", vdecCompNames);
1708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    QOMX_VIDEO_QUERY_DECODER_INSTANCES decoder_instances;
1711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxresult = OMX_GetConfig(dec_handle,
1712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                 (OMX_INDEXTYPE)OMX_QcomIndexQueryNumberOfVideoDecInstance,
1713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              &decoder_instances);
1714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("\n Number of decoder instances %d",
1715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      decoder_instances.nNumOfInstances);
1716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Get the port information */
1718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    CONFIG_VERSION_SIZE(portParam);
1719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omxresult = OMX_GetParameter(dec_handle, OMX_IndexParamVideoInit,
1720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                (OMX_PTR)&portParam);
1721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(FAILED(omxresult)) {
1723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("ERROR - Failed to get Port Param\n");
1724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
1725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("portParam.nPorts:%d\n", portParam.nPorts);
1729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("portParam.nStartPortNumber:%d\n", portParam.nStartPortNumber);
1730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Set the compression format on i/p port */
1733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (codec_format_option == CODEC_FORMAT_H264)
1734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
1736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (codec_format_option == CODEC_FORMAT_MP4)
1738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (codec_format_option == CODEC_FORMAT_H263)
1742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
1744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (codec_format_option == CODEC_FORMAT_VC1)
1746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingWMV;
1748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (codec_format_option == CODEC_FORMAT_DIVX)
1750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt.format.video.eCompressionFormat =
1752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
1753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (codec_format_option == CODEC_FORMAT_MPEG2)
1755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
1757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
1759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
1761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return 0;
1765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
1766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint Play_Decoder()
1768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_VIDEO_PARAM_PORTFORMATTYPE videoportFmt = {0};
1770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int i, bufCnt, index = 0;
1771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int frameSize=0;
1772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE ret = OMX_ErrorNone;
1773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_BUFFERHEADERTYPE* pBuffer = NULL;
1774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
1775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* open the i/p and o/p files based on the video file format passed */
1777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(open_video_file()) {
1778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Error in opening video file\n");
1779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
1780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_QCOM_PARAM_PORTDEFINITIONTYPE inputPortFmt;
1783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    memset(&inputPortFmt, 0, sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE));
1784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    CONFIG_VERSION_SIZE(inputPortFmt);
1785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    inputPortFmt.nPortIndex = 0;  // input port
1786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch (file_type_option)
1787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case FILE_TYPE_DAT_PER_AU:
1789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case FILE_TYPE_PICTURE_START_CODE:
1790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case FILE_TYPE_MPEG2_START_CODE:
1791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case FILE_TYPE_RCV:
1792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case FILE_TYPE_VC1:
1793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case FILE_TYPE_DIVX_311:
1795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_OnlyOneCompleteFrame;
1798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
1799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case FILE_TYPE_ARBITRARY_BYTES:
1802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      case FILE_TYPE_264_NAL_SIZE_LENGTH:
1803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case FILE_TYPE_DIVX_4_5_6:
1804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
1805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_Arbitrary;
1806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
1807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
1808dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      default:
1810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_Unspecified;
1811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
1813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     (OMX_PTR)&inputPortFmt);
1814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EXTERN_PMEM_BUF
1815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PARAM_PORTDEFINITIONTYPE outPortFmt;
1816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&outPortFmt, 0, sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE));
1817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    CONFIG_VERSION_SIZE(outPortFmt);
1818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    outPortFmt.nPortIndex = 1;  // output port
1819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    outPortFmt.nCacheAttr = OMX_QCOM_CacheAttrNone;
1820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    outPortFmt.nMemRegion = OMX_QCOM_MemRegionSMI;
1821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
1822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_PTR)&outPortFmt);
1823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORMPRIVATE_EXTN outPltPvtExtn;
1825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&outPltPvtExtn, 0, sizeof(OMX_QCOM_PLATFORMPRIVATE_EXTN));
1826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    CONFIG_VERSION_SIZE(outPltPvtExtn);
1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    outPltPvtExtn.nPortIndex = 1;  // output port
1828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    outPltPvtExtn.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPlatformPvt,
1830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_PTR)&outPltPvtExtn);
1831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    use_external_pmem_buf = OMX_TRUE;
1832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    QOMX_ENABLETYPE extra_data;
1834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra_data.bEnable = OMX_TRUE;
1835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 0
1836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamInterlaceExtraData,
1837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_PTR)&extra_data);
1838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 0
1840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamConcealMBMapExtraData,
1841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_PTR)&extra_data);
1842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 1
1844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamFrameInfoExtraData,
1845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_PTR)&extra_data);
1846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef TEST_TS_FROM_SEI
1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamH264TimeInfo,
1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_PTR)&extra_data);
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 0
1852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    extra_data.bEnable = OMX_FALSE;
1853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamConcealMBMapExtraData,
1854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     (OMX_PTR)&extra_data);
1855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Query the decoder outport's min buf requirements */
1857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    CONFIG_VERSION_SIZE(portFmt);
1858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Port for which the Client needs to obtain info */
1860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    portFmt.nPortIndex = portParam.nStartPortNumber;
1861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
1863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("\nDec: Min Buffer Count %d\n", portFmt.nBufferCountMin);
1864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("\nDec: Buffer Size %d\n", portFmt.nBufferSize);
1865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(OMX_DirInput != portFmt.eDir) {
1867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf ("\nDec: Expect Input Port\n");
1868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
1869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if( (codec_format_option == CODEC_FORMAT_DIVX) &&
1872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (file_type_option == FILE_TYPE_DIVX_311) ) {
1873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            int off;
1875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ( read(inputBufferFileFd, &width, 4 ) == -1 ) {
1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nFailed to read width for divx\n");
1878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return  -1;
1879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("\nWidth for DIVX = %d\n", width);
1882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ( read(inputBufferFileFd, &height, 4 ) == -1 ) {
1884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                DEBUG_PRINT_ERROR("\nFailed to read height for divx\n");
1885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return  -1;
1886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("\nHeight for DIVX = %u\n", height);
1889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            sliceheight = height;
1890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            stride = width;
1891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bufCnt = 0;
1895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    portFmt.format.video.nFrameHeight = height;
1896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    portFmt.format.video.nFrameWidth  = width;
1897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portFmt.format.video.xFramerate = fps;
1898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SetParameter(dec_handle,OMX_IndexParamPortDefinition, (OMX_PTR)&portFmt);
1899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition, &portFmt);
1900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("\nDec: New Min Buffer Count %d", portFmt.nBufferCountMin);
1901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    CONFIG_VERSION_SIZE(videoportFmt);
1902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
1903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(color_fmt_type == 0)
1904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        color_fmt = OMX_COLOR_FormatYUV420SemiPlanar;
1906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        color_fmt = (OMX_COLOR_FORMATTYPE)
1910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
1911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1912dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#elif _COPPER_
1913dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        color_fmt = OMX_COLOR_FormatYUV420SemiPlanar;
1914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       color_fmt = (OMX_COLOR_FORMATTYPE)
1916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
1917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (ret == OMX_ErrorNone)
1920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        videoportFmt.nPortIndex = 1;
1922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        videoportFmt.nIndex = index;
1923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = OMX_GetParameter(dec_handle, OMX_IndexParamVideoPortFormat,
1924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (OMX_PTR)&videoportFmt);
1925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if((ret == OMX_ErrorNone) && (videoportFmt.eColorFormat ==
1927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           color_fmt))
1928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("\n Format[%u] supported by OMX Decoder", color_fmt);
1930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        index++;
1933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ret == OMX_ErrorNone)
1936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(OMX_SetParameter(dec_handle, OMX_IndexParamVideoPortFormat,
1938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (OMX_PTR)&videoportFmt) != OMX_ErrorNone)
1939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\n Setting Tile format failed");
1941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return -1;
1942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Error in retrieving supported color formats");
1947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
1948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    picture_order.nPortIndex = 1;
1950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\nSet picture order\n");
1951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_SetParameter(dec_handle,
1952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	   (OMX_INDEXTYPE)OMX_QcomIndexParamVideoDecoderPictureOrder,
1953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (OMX_PTR)&picture_order) != OMX_ErrorNone)
1954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n ERROR: Setting picture order!");
1956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
1957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\nVideo format: W x H (%d x %d)",
1959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt.format.video.nFrameWidth,
1960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt.format.video.nFrameHeight);
1961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(codec_format_option == CODEC_FORMAT_H264)
1962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
1963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_VIDEO_CONFIG_NALSIZE naluSize;
1964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        naluSize.nNaluBytes = nalSize;
1965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("\n Nal length is %d index %d",nalSize,OMX_IndexConfigVideoNalSize);
1966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_SetConfig(dec_handle,OMX_IndexConfigVideoNalSize,(OMX_PTR)&naluSize);
1967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("SETTING THE NAL SIZE to %d\n",naluSize.nNaluBytes);
1968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
1969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("\nOMX_SendCommand Decoder -> IDLE\n");
1970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateIdle,0);
1971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    input_buf_cnt = portFmt.nBufferCountActual;
1973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Transition to Idle State succesful...\n");
1974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
1975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if ALLOCATE_BUFFER
1976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       // Allocate buffer on decoder's i/p port
1977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       error = Allocate_Buffer(dec_handle, &pInputBufHdrs, portFmt.nPortIndex,
1978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                               portFmt.nBufferCountActual, portFmt.nBufferSize);
1979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (error != OMX_ErrorNone) {
1980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Input buffer error\n");
1981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           return -1;
1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       else {
1984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT("\nOMX_AllocateBuffer Input buffer success\n");
1985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       // Use buffer on decoder's i/p port
1988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          input_use_buffer = true;
1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n before OMX_UseBuffer %p", &pInputBufHdrs);
1990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          error =  use_input_buffer(dec_handle,
1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             &pInputBufHdrs,
1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              portFmt.nPortIndex,
1993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              portFmt.nBufferSize,
1994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              portFmt.nBufferCountActual);
1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (error != OMX_ErrorNone) {
1996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
1997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             return -1;
1998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
1999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else {
2000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
2001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       portFmt.nPortIndex = portParam.nStartPortNumber+1;
2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       // Port for which the Client needs to obtain info
2005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
2007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("nMin Buffer Count=%d", portFmt.nBufferCountMin);
2008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("nBuffer Size=%d", portFmt.nBufferSize);
2009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(OMX_DirOutput != portFmt.eDir) {
2010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Error - Expect Output Port\n");
2011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
2012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_EGL_IMAGE_TEST_APP
2015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (use_external_pmem_buf)
2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n Use External pmem buf: OMX_UseBuffer %p", &pInputBufHdrs);
2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        error =  use_output_buffer_multiple_fd(dec_handle,
2019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               &pOutYUVBufHdrs,
2020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               portFmt.nPortIndex,
2021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               portFmt.nBufferSize,
2022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               portFmt.nBufferCountActual);
2023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
2025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Allocate buffer on decoder's o/p port */
2027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
2028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                portFmt.nBufferCountActual, portFmt.nBufferSize);
2029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_op_buf_cnt = portFmt.nBufferCountActual;
2031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (error != OMX_ErrorNone) {
2032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Output buffer error\n");
2033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
2034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("OMX_AllocateBuffer Output buffer success\n");
2038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
2040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n before OMX_UseBuffer %p", &pInputBufHdrs);
2041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error =  use_output_buffer(dec_handle,
2042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       &pOutYUVBufHdrs,
2043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        portFmt.nPortIndex,
2044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        portFmt.nBufferSize,
2045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        portFmt.nBufferCountActual);
2046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_op_buf_cnt = portFmt.nBufferCountActual;
2047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (error != OMX_ErrorNone) {
2048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
2049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return -1;
2050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else {
2052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
2053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    wait_for_event();
2056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (currentStatus == ERROR_STATE)
2057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      do_freeHandle_and_clean_up(true);
2059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
2060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (freeHandle_option == FREE_HANDLE_AT_IDLE)
2063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_STATETYPE state = OMX_StateInvalid;
2065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_GetState(dec_handle, &state);
2066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (state == OMX_StateIdle)
2067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Decoder is in OMX_StateIdle and trying to call OMX_FreeHandle \n");
2069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        do_freeHandle_and_clean_up(false);
2070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
2074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        do_freeHandle_and_clean_up(true);
2075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
2077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("OMX_SendCommand Decoder -> Executing\n");
2081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateExecuting,0);
2082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    wait_for_event();
2083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (currentStatus == ERROR_STATE)
2084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      do_freeHandle_and_clean_up(true);
2086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
2087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pOutYUVBufHdrs == NULL)
2089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs is NULL\n");
2091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
2092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
2094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("OMX_FillThisBuffer on output buf no.%d\n",bufCnt);
2095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pOutYUVBufHdrs[bufCnt] == NULL)
2096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs[%d] is NULL\n", bufCnt);
2098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return -1;
2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pOutYUVBufHdrs[bufCnt]->nOutputPortIndex = 1;
2101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pOutYUVBufHdrs[bufCnt]->nFlags &= ~OMX_BUFFERFLAG_EOS;
2102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ret = OMX_FillThisBuffer(dec_handle, pOutYUVBufHdrs[bufCnt]);
2103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (OMX_ErrorNone != ret)
2104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT_ERROR("Error - OMX_FillThisBuffer failed with result %d\n", ret);
2105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            DEBUG_PRINT("OMX_FillThisBuffer success!\n");
2108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_op_buf_cnt--;
2109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    used_ip_buf_cnt = input_buf_cnt;
2113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    rcv_v1 = 0;
2115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //QPERF_START(client_decode);
2117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (codec_format_option == CODEC_FORMAT_VC1)
2118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[0]->nOffset = 0;
2120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(file_type_option == FILE_TYPE_RCV)
2121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      frameSize = Read_Buffer_From_RCV_File_Seq_Layer(pInputBufHdrs[0]);
2123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[0]->nFilledLen = frameSize;
2124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT("After Read_Buffer_From_RCV_File_Seq_Layer, "
2125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              "frameSize %d\n", frameSize);
2126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else if(file_type_option == FILE_TYPE_VC1)
2128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bHdrflag = 1;
2130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pInputBufHdrs[0]->nFilledLen = Read_Buffer(pInputBufHdrs[0]);
2131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          bHdrflag = 0;
2132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("After 1st Read_Buffer for VC1, "
2133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              "pInputBufHdrs[0]->nFilledLen %d\n", pInputBufHdrs[0]->nFilledLen);
2134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          pInputBufHdrs[0]->nFilledLen = Read_Buffer(pInputBufHdrs[0]);
2138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT("After Read_Buffer pInputBufHdrs[0]->nFilledLen %d\n",
2139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly              pInputBufHdrs[0]->nFilledLen);
2140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[0]->nInputPortIndex = 0;
2143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[0]->nOffset = 0;
2144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[0]->nFlags = 0;
2145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      ret = OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[0]);
2147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (ret != OMX_ErrorNone)
2148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("ERROR - OMX_EmptyThisBuffer failed with result %d\n", ret);
2150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          do_freeHandle_and_clean_up(true);
2151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return -1;
2152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          etb_count++;
2156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
2157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      i = 1;
2159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      i = 0;
2163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (i; i < used_ip_buf_cnt;i++) {
2166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[i]->nInputPortIndex = 0;
2167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[i]->nOffset = 0;
2168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if((frameSize = Read_Buffer(pInputBufHdrs[i])) <= 0 ){
2169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("NO FRAME READ\n");
2170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pInputBufHdrs[i]->nFilledLen = frameSize;
2171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pInputBufHdrs[i]->nInputPortIndex = 0;
2172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pInputBufHdrs[i]->nFlags |= OMX_BUFFERFLAG_EOS;;
2173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bInputEosReached = true;
2174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
2176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        etb_count++;
2177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("File is small::Either EOS or Some Error while reading file\n");
2178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        break;
2179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[i]->nFilledLen = frameSize;
2181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[i]->nInputPortIndex = 0;
2182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      pInputBufHdrs[i]->nFlags = 0;
2183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//pBufHdr[bufCnt]->pAppPrivate = this;
2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pInputBufHdrs[i]->nTimeStamp);
2185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      ret = OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
2186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (OMX_ErrorNone != ret) {
2187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("ERROR - OMX_EmptyThisBuffer failed with result %d\n", ret);
2188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          do_freeHandle_and_clean_up(true);
2189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          return -1;
2190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else {
2192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
2193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          etb_count++;
2194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(0 != pthread_create(&ebd_thread_id, NULL, ebd_thread, NULL))
2198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("\n Error in Creating fbd_thread \n");
2200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      free_queue(etb_queue);
2201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      free_queue(fbd_queue);
2202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
2203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // wait for event port settings changed event
2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("wait_for_event: dyn reconfig");
2207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    wait_for_event();
2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("wait_for_event: dyn reconfig rcvd, currentStatus %d\n",
2209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  currentStatus);
2210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (currentStatus == ERROR_STATE)
2211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      printf("Error - ERROR_STATE\n");
2213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      do_freeHandle_and_clean_up(true);
2214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
2215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (currentStatus == PORT_SETTING_CHANGE_STATE)
2217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (output_port_reconfig() != 0)
2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (freeHandle_option == FREE_HANDLE_AT_EXECUTING)
2223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_STATETYPE state = OMX_StateInvalid;
2225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_GetState(dec_handle, &state);
2226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (state == OMX_StateExecuting)
2227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Decoder is in OMX_StateExecuting and trying to call OMX_FreeHandle \n");
2229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        do_freeHandle_and_clean_up(false);
2230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
2234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        do_freeHandle_and_clean_up(true);
2235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
2237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if (freeHandle_option == FREE_HANDLE_AT_PAUSE)
2239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StatePause,0);
2241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      wait_for_event();
2242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_STATETYPE state = OMX_StateInvalid;
2244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      OMX_GetState(dec_handle, &state);
2245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (state == OMX_StatePause)
2246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Decoder is in OMX_StatePause and trying to call OMX_FreeHandle \n");
2248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        do_freeHandle_and_clean_up(false);
2249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      else
2251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Error - Decoder is in state %d and trying to call OMX_FreeHandle \n", state);
2253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        do_freeHandle_and_clean_up(true);
2254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return -1;
2256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return 0;
2259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *dec_handle,
2262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_BUFFERHEADERTYPE  ***pBufHdrs,
2263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_U32 nPortIndex,
2264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       long bufCntMin, long bufSize)
2265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE error=OMX_ErrorNone;
2268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    long bufCnt=0;
2269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("pBufHdrs = %x,bufCntMin = %d\n", pBufHdrs, bufCntMin);
2271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
2272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                   malloc(sizeof(OMX_BUFFERHEADERTYPE)*bufCntMin);
2273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
2275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("OMX_AllocateBuffer No %d \n", bufCnt);
2276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        error = OMX_AllocateBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
2277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   nPortIndex, NULL, bufSize);
2278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return error;
2281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic OMX_ERRORTYPE use_input_buffer ( OMX_COMPONENTTYPE *dec_handle,
2284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_BUFFERHEADERTYPE  ***pBufHdrs,
2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 nPortIndex,
2286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 bufSize,
2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  long bufCntMin)
2288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE error=OMX_ErrorNone;
2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    long bufCnt=0;
2292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U8* pvirt = NULL;
2293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*pBufHdrs == NULL){
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // allocate input buffers
2303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pvirt = (OMX_U8*) malloc (bufSize);
2305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pvirt == NULL){
2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n pvirt Allocation failed ");
2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              nPortIndex, NULL, bufSize, pvirt);
2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return error;
2313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic OMX_ERRORTYPE use_output_buffer ( OMX_COMPONENTTYPE *dec_handle,
2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_BUFFERHEADERTYPE  ***pBufHdrs,
2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 nPortIndex,
2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 bufSize,
2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  long bufCntMin)
2320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE error=OMX_ErrorNone;
2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    long bufCnt=0;
2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U8* pvirt = NULL;
2325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
2328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*pBufHdrs == NULL){
2329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
2330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    output_use_buffer = true;
2333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    p_eglHeaders = (struct temp_egl **)
2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    malloc(sizeof(struct temp_egl *)* bufCntMin);
2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!p_eglHeaders){
2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n EGL allocation failed");
2337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // allocate input buffers
2342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
2343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_eglHeaders[bufCnt] = (struct temp_egl*)
2344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         malloc(sizeof(struct temp_egl));
2345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!p_eglHeaders[bufCnt]) {
2346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n EGL allocation failed");
2347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
2348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_eglHeaders[bufCnt]->pmem_fd = open(PMEM_DEVICE,O_RDWR);
2350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_eglHeaders[bufCnt]->offset = 0;
2351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(p_eglHeaders[bufCnt]->pmem_fd < 0) {
2352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
2353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
2354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* TBD - this commenting is dangerous */
2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      align_pmem_buffers(p_eglHeaders[bufCnt]->pmem_fd, bufSize,
2359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  8192);
2360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n allocation size %d pmem fd %d",bufSize,p_eglHeaders[bufCnt]->pmem_fd);
2362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
2363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      MAP_SHARED,p_eglHeaders[bufCnt]->pmem_fd,0);
2364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\n Virtaul Address %p Size %d",pvirt,bufSize);
2365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pvirt == MAP_FAILED) {
2366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n mmap failed for buffers");
2367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        use_buf_virt_addr[bufCnt] = (unsigned)pvirt;
2370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        error = OMX_UseEGLImage(dec_handle, &((*pBufHdrs)[bufCnt]),
2371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              nPortIndex, pvirt,(void *)p_eglHeaders[bufCnt]);
2372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
2373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return error;
2374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic OMX_ERRORTYPE use_output_buffer_multiple_fd ( OMX_COMPONENTTYPE *dec_handle,
2377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_BUFFERHEADERTYPE  ***pBufHdrs,
2378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 nPortIndex,
2379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 bufSize,
2380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  long bufCntMin)
2381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE error=OMX_ErrorNone;
2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    long bufCnt=0;
2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U8* pvirt = NULL;
2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
2388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
2389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*pBufHdrs == NULL){
2390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
2391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPlatformList = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)
2394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST)* bufCntMin);
2395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(pPlatformList == NULL){
2397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n pPlatformList Allocation failed ");
2398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPlatformEntry = (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
2402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY)* bufCntMin);
2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(pPlatformEntry == NULL){
2405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n pPlatformEntry Allocation failed ");
2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
2410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO)* bufCntMin);
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(pPMEMInfo == NULL){
2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n pPMEMInfo Allocation failed ");
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //output_use_buffer = true;
2418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // allocate input buffers
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("OMX_UseBuffer_multiple_fd No %d %d \n", bufCnt, bufSize);
2421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry[bufCnt].type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformEntry[bufCnt].entry      = &pPMEMInfo[bufCnt];
2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // Initialize the Platform List
2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList[bufCnt].nEntries    = 1;
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPlatformList[bufCnt].entryList   = &pPlatformEntry[bufCnt];
2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo[bufCnt].offset          =  0;
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pPMEMInfo[bufCnt].pmem_fd = open(PMEM_DEVICE,O_RDWR);;
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pPMEMInfo[bufCnt].pmem_fd < 0) {
2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorInsufficientResources;
2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* TBD - this commenting is dangerous */
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      align_pmem_buffers(pPMEMInfo[bufCnt].pmem_fd, bufSize,
2436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  8192);
2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("\n allocation size %d pmem fd 0x%x",bufSize,pPMEMInfo[bufCnt].pmem_fd);
2439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      MAP_SHARED,pPMEMInfo[bufCnt].pmem_fd,0);
2441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      getFreePmem();
2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("\n Virtaul Address %p Size %d pmem_fd=0x%x",pvirt,bufSize,pPMEMInfo[bufCnt].pmem_fd);
2443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pvirt == MAP_FAILED) {
2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n mmap failed for buffers");
2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
2446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      use_buf_virt_addr[bufCnt] = (unsigned)pvirt;
2448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
2449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            nPortIndex, &pPlatformList[bufCnt], bufSize, pvirt);
2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return error;
2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic void do_freeHandle_and_clean_up(bool isDueToError)
2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int bufCnt = 0;
2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_STATETYPE state = OMX_StateInvalid;
2457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_GetState(dec_handle, &state);
2458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (state == OMX_StateExecuting || state == OMX_StatePause)
2459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("Requesting transition to Idle");
2461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateIdle, 0);
2462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      wait_for_event();
2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_GetState(dec_handle, &state);
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (state == OMX_StateIdle)
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("Requesting transition to Loaded");
2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateLoaded, 0);
2469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt)
2470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (pInputBufHdrs[bufCnt]->pBuffer && input_use_buffer)
2472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free(pInputBufHdrs[bufCnt]->pBuffer);
2474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pInputBufHdrs[bufCnt]->pBuffer = NULL;
2475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nFree(pInputBufHdrs[%d]->pBuffer)",bufCnt);
2476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_FreeBuffer(dec_handle, 0, pInputBufHdrs[bufCnt]);
2478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pInputBufHdrs)
2480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         free(pInputBufHdrs);
2482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         pInputBufHdrs = NULL;
2483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(bufCnt = 0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (output_use_buffer && p_eglHeaders) {
2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(p_eglHeaders[bufCnt]) {
2487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
2488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       pOutYUVBufHdrs[bufCnt]->nAllocLen);
2489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               close(p_eglHeaders[bufCnt]->pmem_fd);
2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               p_eglHeaders[bufCnt]->pmem_fd = -1;
2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               free(p_eglHeaders[bufCnt]);
2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               p_eglHeaders[bufCnt] = NULL;
2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (use_external_pmem_buf)
2496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("Freeing in external pmem case: buffer=0x%x, pmem_fd=0x%d",
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              pOutYUVBufHdrs[bufCnt]->pBuffer,
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              pPMEMInfo[bufCnt].pmem_fd);
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (pOutYUVBufHdrs[bufCnt]->pBuffer)
2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        pOutYUVBufHdrs[bufCnt]->nAllocLen);
2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (&pPMEMInfo[bufCnt])
2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close(pPMEMInfo[bufCnt].pmem_fd);
2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pPMEMInfo[bufCnt].pmem_fd = -1;
2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_FreeBuffer(dec_handle, 1, pOutYUVBufHdrs[bufCnt]);
2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(p_eglHeaders) {
2514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free(p_eglHeaders);
2515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          p_eglHeaders = NULL;
2516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pPMEMInfo)
2518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("Freeing in external pmem case:PMEM");
2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free(pPMEMInfo);
2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pPMEMInfo = NULL;
2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pPlatformEntry)
2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("Freeing in external pmem case:ENTRY");
2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free(pPlatformEntry);
2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pPlatformEntry = NULL;
2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pPlatformList)
2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("Freeing in external pmem case:LIST");
2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          free(pPlatformList);
2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          pPlatformList = NULL;
2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      wait_for_event();
2536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("[OMX Vdec Test] - Free handle decoder\n");
2539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE result = OMX_FreeHandle(dec_handle);
2540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (result != OMX_ErrorNone)
2541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       DEBUG_PRINT_ERROR("[OMX Vdec Test] - OMX_FreeHandle error. Error code: %d\n", result);
2543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    dec_handle = NULL;
2545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Deinit OpenMAX */
2547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("[OMX Vdec Test] - De-initializing OMX \n");
2548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_Deinit();
2549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("[OMX Vdec Test] - closing all files\n");
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(inputBufferFileFd != -1)
2552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        close(inputBufferFileFd);
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        inputBufferFileFd = -1;
2555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("[OMX Vdec Test] - after free inputfile\n");
2558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (takeYuvLog && outputBufferFile) {
2560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        fclose(outputBufferFile);
2561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        outputBufferFile = NULL;
2562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("[OMX Vdec Test] - after free outputfile\n");
2564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(etb_queue)
2566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      free_queue(etb_queue);
2568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      etb_queue = NULL;
2569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("[OMX Vdec Test] - after free etb_queue \n");
2571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(fbd_queue)
2572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      free_queue(fbd_queue);
2574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      fbd_queue = NULL;
2575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("[OMX Vdec Test] - after free iftb_queue\n");
2577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    printf("*****************************************\n");
2578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (isDueToError)
2579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("************...TEST FAILED...************\n");
2580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("**********...TEST SUCCESSFULL...*********\n");
2582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    printf("*****************************************\n");
2583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_DAT_File(OMX_BUFFERHEADERTYPE  *pBufHdr)
2586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    long frameSize=0;
2588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char temp_buffer[10];
2589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char temp_byte;
2590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int bytes_read=0;
2591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int i=0;
2592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned char *read_buffer=NULL;
2593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char c = '1'; //initialize to anything except '\0'(0)
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char inputFrameSize[12];
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int count =0; char cnt =0;
2596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    memset(temp_buffer, 0, sizeof(temp_buffer));
2597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    while (cnt < 10)
2601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Check the input file format, may result in infinite loop */
2602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("loop[%d] count[%d]\n",cnt,count);
2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        count = read( inputBufferFileFd, &inputFrameSize[cnt], 1);
2605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(inputFrameSize[cnt] == '\0' )
2606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
2607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        cnt++;
2608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    inputFrameSize[cnt]='\0';
2610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    frameSize = atoi(inputFrameSize);
2611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nFilledLen = 0;
2612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* get the frame length */
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    lseek64(inputBufferFileFd, -1, SEEK_CUR);
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer, frameSize);
2616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Actual frame Size [%d] bytes_read using fread[%d]\n",
2618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  frameSize, bytes_read);
2619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(bytes_read == 0 || bytes_read < frameSize ) {
2621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Bytes read Zero After Read frame Size \n");
2622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Checking VideoPlayback Count:video_playback_count is:%d\n",
2623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       video_playback_count);
2624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return 0;
2625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nTimeStamp = timeStampLfile;
2627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    timeStampLfile += timestampInterval;
2628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return bytes_read;
2629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_ArbitraryBytes(OMX_BUFFERHEADERTYPE  *pBufHdr)
2632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int bytes_read=0;
2634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer, NUMBER_OF_ARBITRARYBYTES_READ);
2636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(bytes_read == 0) {
2637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Bytes read Zero After Read frame Size \n");
2638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Checking VideoPlayback Count:video_playback_count is:%d\n",
2639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                      video_playback_count);
2640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return 0;
2641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef TEST_TS_FROM_SEI
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (timeStampLfile == 0)
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pBufHdr->nTimeStamp = 0;
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pBufHdr->nTimeStamp = LLONG_MAX;
2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
2648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nTimeStamp = timeStampLfile;
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    timeStampLfile += timestampInterval;
2651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return bytes_read;
2652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_Vop_Start_Code_File(OMX_BUFFERHEADERTYPE  *pBufHdr)
2655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int readOffset = 0;
2657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int bytes_read = 0;
2658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int code = 0;
2659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nFilledLen = 0;
2660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    static unsigned int header_code = 0;
2661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Inside %s", __FUNCTION__);
2663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    do
2665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      //Start codes are always byte aligned.
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes_read = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(bytes_read == 0 || bytes_read == -1)
2669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT("Bytes read Zero \n");
2671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
2672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      code <<= 8;
2674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
2675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      //VOP start code comparision
2676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if (readOffset>3)
2677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(!header_code ){
2679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          if( VOP_START_CODE == code)
2680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            header_code = VOP_START_CODE;
2682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          else if ( (0xFFFFFC00 & code) == SHORT_HEADER_START_CODE )
2684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          {
2685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            header_code = SHORT_HEADER_START_CODE;
2686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          }
2687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if ((header_code == VOP_START_CODE) && (code == VOP_START_CODE))
2689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            //Seek backwards by 4
2691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            lseek64(inputBufferFileFd, -4, SEEK_CUR);
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            readOffset-=3;
2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else if (( header_code == SHORT_HEADER_START_CODE ) && ( SHORT_HEADER_START_CODE == (code & 0xFFFFFC00)))
2696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            //Seek backwards by 4
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            lseek64(inputBufferFileFd, -4, SEEK_CUR);
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            readOffset-=3;
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      readOffset++;
2704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }while (1);
2705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nTimeStamp = timeStampLfile;
2706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    timeStampLfile += timestampInterval;
2707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return readOffset;
2708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int Read_Buffer_From_Mpeg2_Start_Code(OMX_BUFFERHEADERTYPE  *pBufHdr)
2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int readOffset = 0;
2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int bytesRead = 0;
2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int code = 0;
2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pBufHdr->nFilledLen = 0;
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  static unsigned int firstParse = true;
2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int seenFrame = false;
2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("Inside %s", __FUNCTION__);
2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Read one byte at a time. Construct the code every byte in order to
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   * compare to the start codes. Keep looping until we've read in a complete
2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   * frame, which can be either just a picture start code + picture, or can
2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   * include the sequence header as well
2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   */
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while (1) {
2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bytesRead = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Exit the loop if we can't read any more bytes */
2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (bytesRead == 0 || bytesRead == -1) {
2730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Construct the code one byte at a time */
2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    code <<= 8;
2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Can't compare the code to MPEG2 start codes until we've read the
2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     * first four bytes
2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     */
2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (readOffset >= 3) {
2741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* If this is the first time we're reading from the file, then we
2743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * need to throw away the system start code information at the
2744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * beginning. We can just look for the first sequence header.
2745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       */
2746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (firstParse) {
2747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (code == MPEG2_SEQ_START_CODE) {
2748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          /* Seek back by 4 bytes and reset code so that we can skip
2749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           * down to the common case below.
2750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           */
2751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          lseek(inputBufferFileFd, -4, SEEK_CUR);
2752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          code = 0;
2753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          readOffset -= 3;
2754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          firstParse = false;
2755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          continue;
2756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /* If we have already parsed a frame and we see a sequence header, then
2760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * the sequence header is part of the next frame so we seek back and
2761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       * break.
2762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       */
2763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (code == MPEG2_SEQ_START_CODE) {
2764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (seenFrame) {
2765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          lseek(inputBufferFileFd, -4, SEEK_CUR);
2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          readOffset -= 3;
2767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* If we haven't seen a frame yet, then read in all the data until we
2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         * either see another frame start code or sequence header start code.
2771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         */
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      } else if (code == MPEG2_FRAME_START_CODE) {
2773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!seenFrame) {
2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          seenFrame = true;
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        } else {
2776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          lseek(inputBufferFileFd, -4, SEEK_CUR);
2777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          readOffset -= 3;
2778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
2779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    readOffset++;
2784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pBufHdr->nTimeStamp = timeStampLfile;
2787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  timeStampLfile += timestampInterval;
2788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return readOffset;
2789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_Size_Nal(OMX_BUFFERHEADERTYPE  *pBufHdr)
2793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // NAL unit stream processing
2795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char temp_size[SIZE_NAL_FIELD_MAX];
2796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int i = 0;
2797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int j = 0;
2798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int size = 0;   // Need to make sure that uint32 has SIZE_NAL_FIELD_MAX (4) bytes
2799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int bytes_read = 0;
2800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // read the "size_nal_field"-byte size field
2802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer + pBufHdr->nOffset, nalSize);
2803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (bytes_read == 0 || bytes_read == -1)
2804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("Failed to read frame or it might be EOF\n");
2806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return 0;
2807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (i=0; i<SIZE_NAL_FIELD_MAX-nalSize; i++)
2810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      temp_size[SIZE_NAL_FIELD_MAX - 1 - i] = 0;
2812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* Due to little endiannes, Reorder the size based on size_nal_field */
2815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (j=0; i<SIZE_NAL_FIELD_MAX; i++, j++)
2816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      temp_size[SIZE_NAL_FIELD_MAX - 1 - i] = pBufHdr->pBuffer[pBufHdr->nOffset + j];
2818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    size = (unsigned int)(*((unsigned int *)(temp_size)));
2820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // now read the data
2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer + pBufHdr->nOffset + nalSize, size);
2823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (bytes_read != size)
2824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Failed to read frame\n");
2826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pBufHdr->nTimeStamp = timeStampLfile;
2829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    timeStampLfile += timestampInterval;
2830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return bytes_read + nalSize;
2832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_RCV_File_Seq_Layer(OMX_BUFFERHEADERTYPE  *pBufHdr)
2835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int readOffset = 0, size_struct_C = 0;
2837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int startcode = 0;
2838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nFilledLen = 0;
2839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nFlags = 0;
2840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    read(inputBufferFileFd, &startcode, 4);
2844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* read size of struct C as it need not be 4 always*/
2846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    read(inputBufferFileFd, &size_struct_C, 4);
2847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /* reseek to beginning of sequence header */
2849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    lseek64(inputBufferFileFd, -8, SEEK_CUR);
2850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if ((startcode & 0xFF000000) == 0xC5000000)
2852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
2855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_WITHOUT_STRUCTC + size_struct_C);
2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else if((startcode & 0xFF000000) == 0x85000000)
2860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      // .RCV V1 file
2862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      rcv_v1 = 1;
2864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
2866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_V1_WITHOUT_STRUCTC + size_struct_C);
2868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT_ERROR("Error: Unknown VC1 clip format %x\n", startcode);
2873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#if 0
2876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      int i=0;
2878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Read_Buffer_From_RCV_File, length %d readOffset %d\n", readOffset, readOffset);
2879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      for (i=0; i<36; i++)
2880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("0x%.2x ", pBufHdr->pBuffer[i]);
2882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (i%16 == 15) {
2883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf("\n");
2884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("\n");
2887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
2889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return readOffset;
2890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_RCV_File(OMX_BUFFERHEADERTYPE  *pBufHdr)
2893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int readOffset = 0;
2895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int len = 0;
2896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int key = 0;
2897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Read_Buffer_From_RCV_File - nOffset %d\n", pBufHdr->nOffset);
2900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(rcv_v1)
2901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* for the case of RCV V1 format, the frame header is only of 4 bytes and has
2903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly         only the frame size information */
2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        readOffset = read(inputBufferFileFd, &len, 4);
2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
2906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* for a regular RCV file, 3 bytes comprise the frame size and 1 byte for key*/
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        readOffset = read(inputBufferFileFd, &len, 3);
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
2913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        readOffset = read(inputBufferFileFd, &key, 1);
2915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if ( (key & 0x80) == false)
2916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT("Read_Buffer_From_RCV_File - Non IDR frame key %x\n", key);
2918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       }
2919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(!rcv_v1)
2923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      /* There is timestamp field only for regular RCV format and not for RCV V1 format*/
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        readOffset = read(inputBufferFileFd, &pBufHdr->nTimeStamp, 4);
2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Read_Buffer_From_RCV_File - timeStamp %d\n", pBufHdr->nTimeStamp);
2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pBufHdr->nTimeStamp *= 1000;
2928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
2930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        pBufHdr->nTimeStamp = timeStampLfile;
2932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        timeStampLfile += timestampInterval;
2933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(len > pBufHdr->nAllocLen)
2936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       DEBUG_PRINT_ERROR("Error in sufficient buffer framesize %d, allocalen %d noffset %d\n",len,pBufHdr->nAllocLen, pBufHdr->nOffset);
2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       readOffset = read(inputBufferFileFd, pBufHdr->pBuffer+pBufHdr->nOffset,
2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                         pBufHdr->nAllocLen - pBufHdr->nOffset);
2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       loff_t off = (len - readOffset)*1LL;
2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       lseek64(inputBufferFileFd, off ,SEEK_CUR);
2943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       return readOffset;
2944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else {
2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        readOffset = read(inputBufferFileFd, pBufHdr->pBuffer+pBufHdr->nOffset, len);
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (readOffset != len)
2949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      DEBUG_PRINT("EOS reach or Reading error %d, %s \n", readOffset, strerror( errno ));
2951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      return 0;
2952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#if 0
2955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      int i=0;
2957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Read_Buffer_From_RCV_File, length %d readOffset %d\n", len, readOffset);
2958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      for (i=0; i<64; i++)
2959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
2960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("0x%.2x ", pBufHdr->pBuffer[i]);
2961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (i%16 == 15) {
2962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf("\n");
2963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
2964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
2965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("\n");
2966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
2967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
2968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return readOffset;
2970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
2971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int Read_Buffer_From_VC1_File(OMX_BUFFERHEADERTYPE  *pBufHdr)
2973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
2974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    static int timeStampLfile = 0;
2975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U8 *pBuffer = pBufHdr->pBuffer + pBufHdr->nOffset;
2976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
2977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int readOffset = 0;
2978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int bytes_read = 0;
2979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int code = 0, total_bytes = 0;
2980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int startCode_cnt = 0;
2981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int bSEQflag = 0;
2982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int bEntryflag = 0;
2983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int SEQbytes = 0;
2984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int numStartcodes = 0;
2985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    numStartcodes = bHdrflag?1:2;
2987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
2988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    do
2989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (total_bytes == pBufHdr->nAllocLen)
2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Buffer overflow!");
2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      //Start codes are always byte aligned.
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes_read = read(inputBufferFileFd, &pBuffer[readOffset],1 );
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      if(!bytes_read)
2999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT("\n Bytes read Zero \n");
3001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      total_bytes++;
3004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      code <<= 8;
3005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     if(!bSEQflag && (code == VC1_SEQUENCE_START_CODE)) {
3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(startCode_cnt) bSEQflag = 1;
3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!bEntryflag && ( code == VC1_ENTRY_POINT_START_CODE)) {
3012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if(startCode_cnt) bEntryflag = 1;
3013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(code == VC1_FRAME_START_CODE || code == VC1_FRAME_FIELD_CODE)
3016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         startCode_cnt++ ;
3018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      //VOP start code comparision
3021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(startCode_cnt == numStartcodes)
3022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (VC1_FRAME_START_CODE == (code & 0xFFFFFFFF) ||
3024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF))
3025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          previous_vc1_au = 0;
3027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF))
3028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              previous_vc1_au = 1;
3030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(!bHdrflag && (bSEQflag || bEntryflag)) {
3033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             lseek(inputBufferFileFd,-(SEQbytes+4),SEEK_CUR);
3034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             readOffset -= (SEQbytes+3);
3035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else {
3037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            //Seek backwards by 4
3038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            lseek64(inputBufferFileFd, -4, SEEK_CUR);
3039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            readOffset-=3;
3040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          while(pBufHdr->pBuffer[readOffset-1] == 0)
3043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            readOffset--;
3044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          break;
3046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      readOffset++;
3049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(bSEQflag || bEntryflag) {
3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        SEQbytes++;
3051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }while (1);
3053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pBufHdr->nTimeStamp = timeStampLfile;
3055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    timeStampLfile += timestampInterval;
3056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#if 0
3058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      int i=0;
3060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("Read_Buffer_From_VC1_File, readOffset %d\n", readOffset);
3061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      for (i=0; i<64; i++)
3062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      {
3063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("0x%.2x ", pBufHdr->pBuffer[i]);
3064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (i%16 == 15) {
3065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          printf("\n");
3066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      }
3068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      printf("\n");
3069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
3071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return readOffset;
3073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int Read_Buffer_From_DivX_4_5_6_File(OMX_BUFFERHEADERTYPE  *pBufHdr)
3076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_NO_B_FRMS 3 // Number of non-b-frames packed in each buffer
3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define N_PREV_FRMS_B 1 // Number of previous non-b-frames packed
3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        // with a set of consecutive b-frames
3080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define FRM_ARRAY_SIZE (MAX_NO_B_FRMS + N_PREV_FRMS_B)
3081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *p_buffer = NULL;
3082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int offset_array[FRM_ARRAY_SIZE];
3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int byte_cntr, pckt_end_idx;
3084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int read_code = 0, bytes_read, byte_pos = 0, frame_type;
3085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int i, b_frm_idx, b_frames_found = 0, vop_set_cntr = 0;
3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bool pckt_ready = false;
3087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char pckt_type[20];
3089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int pckd_frms = 0;
3090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    static unsigned long long int total_bytes = 0;
3091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    static unsigned long long int total_frames = 0;
3092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //__DEBUG_DIVX__
3093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    do {
3097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      p_buffer = (char *)pBufHdr->pBuffer + byte_pos;
3098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bytes_read = read(inputBufferFileFd, p_buffer, NUMBER_OF_ARBITRARYBYTES_READ);
3100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      byte_pos += bytes_read;
3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for (byte_cntr = 0; byte_cntr < bytes_read && !pckt_ready; byte_cntr++) {
3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        read_code <<= 8;
3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ((char*)&read_code)[0] = p_buffer[byte_cntr];
3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (read_code == VOP_START_CODE) {
3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (++byte_cntr < bytes_read) {
3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            frame_type = p_buffer[byte_cntr];
3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            frame_type &= 0x000000C0;
3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            switch (frame_type) {
3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case 0x00: pckt_type[pckd_frms] = 'I'; break;
3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case 0x40: pckt_type[pckd_frms] = 'P'; break;
3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              case 0x80: pckt_type[pckd_frms] = 'B'; break;
3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              default: pckt_type[pckd_frms] = 'X';
3114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pckd_frms++;
3116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // __DEBUG_DIVX__
3117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            offset_array[vop_set_cntr] = byte_pos - bytes_read + byte_cntr - 4;
3118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (frame_type == 0x80) { // B Frame found!
3119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if (!b_frames_found) {
3120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Try to packet N_PREV_FRMS_B previous frames
3121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // with the next consecutive B frames
3122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                i = N_PREV_FRMS_B;
3123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                while ((vop_set_cntr - i) < 0 && i > 0) i--;
3124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                b_frm_idx = vop_set_cntr - i;
3125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                if (b_frm_idx > 0) {
3126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pckt_end_idx = b_frm_idx;
3127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pckt_ready = true;
3128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pckt_type[b_frm_idx] = '\0';
3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  total_frames += b_frm_idx;
3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //__DEBUG_DIVX__
3132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                }
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              b_frames_found++;
3135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else if (b_frames_found) {
3136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_end_idx = vop_set_cntr;
3137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_ready = true;
3138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_type[pckd_frms - 1] = '\0';
3140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              total_frames += pckd_frms - 1;
3141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //__DEBUG_DIVX__
3142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else if (vop_set_cntr == (FRM_ARRAY_SIZE -1)) {
3143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_end_idx = MAX_NO_B_FRMS;
3144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_ready = true;
3145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_type[pckt_end_idx] = '\0';
3147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              total_frames += pckt_end_idx;
3148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //__DEBUG_DIVX__
3149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            } else
3150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              vop_set_cntr++;
3151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          } else {
3152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // The vop start code was found in the last 4 bytes,
3153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // seek backwards by 4 to include this start code
3154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // with the next buffer.
3155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            lseek64(inputBufferFileFd, -4, SEEK_CUR);
3156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            byte_pos -= 4;
3157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pckd_frms--;
3159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //__DEBUG_DIVX__
3160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (pckt_ready) {
3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          loff_t off = (byte_pos - offset_array[pckt_end_idx]);
3165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ( lseek64(inputBufferFileFd, -1LL*off , SEEK_CUR) == -1 ){
3166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("lseek64 with offset = %lld failed with errno %d"
3167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                ", current position =0x%llx", -1LL*off,
3168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                errno, lseek64(inputBufferFileFd, 0, SEEK_CUR));
3169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
3172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          char eofByte;
3173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          int ret = read(inputBufferFileFd, &eofByte, 1 );
3174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if ( ret == 0 ) {
3175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              offset_array[vop_set_cntr] = byte_pos;
3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_end_idx = vop_set_cntr;
3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_ready = true;
3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pckt_type[pckd_frms] = '\0';
3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              total_frames += pckd_frms;
3181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //__DEBUG_DIVX__
3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else if (ret == 1){
3184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if ( lseek64(inputBufferFileFd, -1, SEEK_CUR ) == -1 ){
3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("lseek64 failed with errno = %d, "
3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                    "current fileposition = %llx",
3187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                    errno,
3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                    lseek64(inputBufferFileFd, 0, SEEK_CUR));
3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else {
3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Error when checking for EOF");
3193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } while (!pckt_ready);
3196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pBufHdr->nFilledLen = offset_array[pckt_end_idx];
3197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pBufHdr->nTimeStamp = timeStampLfile;
3198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    timeStampLfile += timestampInterval;
3199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef __DEBUG_DIVX__
3200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    total_bytes += pBufHdr->nFilledLen;
3201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ALOGE("[DivX] Packet: Type[%s] Size[%u] TS[%lld] TB[%llx] NFrms[%lld]\n",
3202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pckt_type, pBufHdr->nFilledLen, pBufHdr->nTimeStamp,
3203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  total_bytes, total_frames);
3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //__DEBUG_DIVX__
3205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return pBufHdr->nFilledLen;
3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int Read_Buffer_From_DivX_311_File(OMX_BUFFERHEADERTYPE  *pBufHdr)
3209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    static OMX_S64 timeStampLfile = 0;
3211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    char *p_buffer = NULL;
3212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bool pkt_ready = false;
3213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int frame_type = 0;
3214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int bytes_read = 0;
3215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int frame_size = 0;
3216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int num_bytes_size = 4;
3217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int num_bytes_frame_type = 1;
3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int n_offset = pBufHdr->nOffset;
3219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Inside %s \n", __FUNCTION__);
3221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pBufHdr->nTimeStamp = timeStampLfile;
3223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pBufHdr != NULL)
3225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_buffer = (char *)pBufHdr->pBuffer + pBufHdr->nOffset;
3227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
3229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: pBufHdr is NULL\n");
3231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return 0;
3232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (p_buffer == NULL)
3235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: p_bufhdr is NULL\n");
3237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return 0;
3238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //Read first frame based on size
3241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //DivX 311 frame - 4 byte header with size followed by the frame
3242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    bytes_read = read(inputBufferFileFd, &frame_size, num_bytes_size);
3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Read_Buffer_From_DivX_311_File: Frame size = %d\n", frame_size);
3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    n_offset += read(inputBufferFileFd, p_buffer, frame_size);
3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pBufHdr->nTimeStamp = timeStampLfile;
3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    timeStampLfile += timestampInterval;
3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //the packet is ready to be sent
3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\nReturning Read Buffer from Divx 311: TS=[%ld], Offset=[%d]\n",
3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (long int)pBufHdr->nTimeStamp,
3255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           n_offset );
3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return n_offset;
3258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystatic int open_video_file ()
3261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int error_code = 0;
3263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char outputfilename[512];
3264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename);
3265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ( (inputBufferFileFd = open( in_filename, O_RDONLY | O_LARGEFILE) ) == -1 ){
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error - i/p file %s could NOT be opened errno = %d\n",
3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                          in_filename, errno);
3269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        error_code = -1;
3270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else {
3272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("i/p file %s is opened \n", in_filename);
3273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (takeYuvLog) {
3276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        strlcpy(outputfilename, "yuvframes.yuv", 14);
3277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        outputBufferFile = fopen (outputfilename, "ab");
3278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (outputBufferFile == NULL)
3279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT_ERROR("ERROR - o/p file %s could NOT be opened\n", outputfilename);
3281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          error_code = -1;
3282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        else
3284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
3285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          DEBUG_PRINT("O/p file %s is opened \n", outputfilename);
3286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
3287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return error_code;
3289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid swap_byte(char *pByte, int nbyte)
3292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  int i=0;
3294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  for (i=0; i<nbyte/2; i++)
3296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  {
3297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pByte[i] ^= pByte[nbyte-i-1];
3298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pByte[nbyte-i-1] ^= pByte[i];
3299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pByte[i] ^= pByte[nbyte-i-1];
3300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  }
3301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint drawBG(void)
3304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int result;
3306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int i;
3307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef FRAMEBUFFER_32
3308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    long * p;
3309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#else
3310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    short * p;
3311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
3312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    void *fb_buf = mmap (NULL, finfo.smem_len,PROT_READ|PROT_WRITE, MAP_SHARED, fb_fd, 0);
3313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (fb_buf == MAP_FAILED)
3315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("ERROR: Framebuffer MMAP failed!\n");
3317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        close(fb_fd);
3318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
3319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    vinfo.yoffset = 0;
3322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    p = (long *)fb_buf;
3323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (i=0; i < vinfo.xres * vinfo.yres; i++)
3325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    #ifdef FRAMEBUFFER_32
3327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        *p++ = COLOR_BLACK_RGBA_8888;
3328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    #else
3329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        *p++ = CLR_KEY;
3330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    #endif
3331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ioctl(fb_fd, FBIOPAN_DISPLAY, &vinfo) < 0)
3334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        printf("ERROR: FBIOPAN_DISPLAY failed! line=%d\n", __LINE__);
3336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return -1;
3337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("drawBG success!\n");
3340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return 0;
3341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid overlay_set()
3344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp = &overlay;
3346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src.width  = stride;
3347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src.height = sliceheight;
3348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
3349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src.format = MDP_Y_CRCB_H2V2;
3350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(color_fmt == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
3351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->src.format = MDP_Y_CRCB_H2V2_TILE;
3353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
3356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src.format = MDP_Y_CBCR_H2V2_TILE;
3357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src_rect.x = 0;
3359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src_rect.y = 0;
3360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src_rect.w = width;
3361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->src_rect.h = height;
3362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(width >= vinfo.xres)
3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.x = 0;
3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.w = vinfo.xres;
3367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
3369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.x = (vinfo.xres - width)/2;
3371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.w = width;
3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(height >= vinfo.yres)
3375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.h = (overlayp->dst_rect.w * height)/width;
3377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.y = 0;
3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (overlayp->dst_rect.h < vinfo.yres)
3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            overlayp->dst_rect.y = (vinfo.yres - overlayp->dst_rect.h)/2;
3380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.y = (vinfo.yres - height)/2;
3384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlayp->dst_rect.h = height;
3385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->z_order = 0;
3388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("overlayp->dst_rect.x = %u \n", overlayp->dst_rect.x);
3389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("overlayp->dst_rect.y = %u \n", overlayp->dst_rect.y);
3390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("overlayp->dst_rect.w = %u \n", overlayp->dst_rect.w);
3391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("overlayp->dst_rect.h = %u \n", overlayp->dst_rect.h);
3392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3393dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    overlayp->alpha = 0x0;
3394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->transp_mask = 0xFFFFFFFF;
3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->flags = 0;
3396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->is_fg = 0;
3397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    overlayp->id = MSMFB_NEW_REQUEST;
3399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    vid_buf_front_id = ioctl(fb_fd, MSMFB_OVERLAY_SET, overlayp);
3400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (vid_buf_front_id < 0)
3401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("ERROR: MSMFB_OVERLAY_SET failed! line=%d\n", __LINE__);
3403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    vid_buf_front_id = overlayp->id;
3405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\n vid_buf_front_id = %u", vid_buf_front_id);
3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drawBG();
3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    displayYuv = 2;
3408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint overlay_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct msmfb_overlay_data ov_front;
3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(&ov_front, 0, sizeof(struct msmfb_overlay_data));
3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    MemoryHeapBase *vheap = NULL;
3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("overlay_fb:");
3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ov_front.id = overlayp->id;
3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pBufHdr->pPlatformPrivate == NULL)
3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ALOGE("overlay_fb: pPlatformPrivate is null");
3424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pPMEMInfo  = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    pBufHdr->pPlatformPrivate)->entryList->entry;
3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pPMEMInfo == NULL)
3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ALOGE("overlay_fb: pmem_info is null");
3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    vheap = (MemoryHeapBase*)pPMEMInfo->pmem_fd;
3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3439dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ov_front.data.memory_id = vheap->getHeapID();
3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ov_front.data.memory_id = pPMEMInfo->pmem_fd;
3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ov_front.data.offset = pPMEMInfo->offset;
3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\n ov_front.data.memory_id = %d", ov_front.data.memory_id);
3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\n ov_front.data.offset = %u", ov_front.data.offset);
3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, (void*)&ov_front))
3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\nERROR! MSMFB_OVERLAY_PLAY failed at frame (Line %d)\n",
3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            __LINE__);
3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\nMSMFB_OVERLAY_PLAY successfull");
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return 0;
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid overlay_unset()
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (ioctl(fb_fd, MSMFB_OVERLAY_UNSET, &vid_buf_front_id))
3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\nERROR! MSMFB_OVERLAY_UNSET failed! (Line %d)\n", __LINE__);
3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
3468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
3469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int addr = 0;
3470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_OTHER_EXTRADATATYPE *pExtraData = 0;
3471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_QCOM_EXTRADATA_FRAMEINFO *pExtraFrameInfo = 0;
3472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
3473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int destx, desty,destW, destH;
3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
3475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    MemoryHeapBase *vheap = NULL;
3476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
3477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int end = (unsigned int)(pBufHdr->pBuffer + pBufHdr->nAllocLen);
3479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct mdp_blit_req *e;
3481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    union {
3482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        char dummy[sizeof(struct mdp_blit_req_list) +
3483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly               sizeof(struct mdp_blit_req) * 1];
3484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        struct mdp_blit_req_list list;
3485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    } img;
3486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (fb_fd < 0)
3488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("Warning: /dev/fb0 is not opened!\n");
3490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return;
3491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    img.list.count = 1;
3494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e = &img.list.req[0];
3495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addr = (unsigned int)(pBufHdr->pBuffer + pBufHdr->nFilledLen);
3497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // align to a 4 byte boundary
3498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addr = (addr + 3) & (~3);
3499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // read to the end of existing extra data sections
3501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pExtraData = (OMX_OTHER_EXTRADATATYPE*)addr;
3502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (addr < end && pExtraData->eType != OMX_ExtraDataFrameInfo)
3504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            addr += pExtraData->nSize;
3506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            pExtraData = (OMX_OTHER_EXTRADATATYPE*)addr;
3507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pExtraData->eType != OMX_ExtraDataFrameInfo)
3510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       DEBUG_PRINT_ERROR("pExtraData->eType %d pExtraData->nSize %d\n",pExtraData->eType,pExtraData->nSize);
3512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pExtraFrameInfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)pExtraData->data;
3514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly   pPMEMInfo  = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
3516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
3517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    pBufHdr->pPlatformPrivate)->entryList->entry;
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
3519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    vheap = (MemoryHeapBase *)pPMEMInfo->pmem_fd;
3520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
3521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("DecWidth %d DecHeight %d\n",portFmt.format.video.nStride,portFmt.format.video.nSliceHeight);
3524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("DispWidth %d DispHeight %d\n",portFmt.format.video.nFrameWidth,portFmt.format.video.nFrameHeight);
3525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3528e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src.width = portFmt.format.video.nStride;
3529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src.height = portFmt.format.video.nSliceHeight;
3530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src.format = MDP_Y_CBCR_H2V2;
3531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        e->src.offset = pPMEMInfo->offset;
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
3533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src.memory_id = vheap->getHeapID();
3534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#else
3535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src.memory_id = pPMEMInfo->pmem_fd;
3536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
3537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT_ERROR("pmemOffset %d pmemID %d\n",e->src.offset,e->src.memory_id);
3539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst.width = vinfo.xres;
3541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst.height = vinfo.yres;
3542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst.format = MDP_RGB_565;
3543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst.offset = 0;
3544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst.memory_id = fb_fd;
3545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->transp_mask = 0xffffffff;
3547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("Frame interlace type %d!\n", pExtraFrameInfo->interlaceType);
3548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if(pExtraFrameInfo->interlaceType != OMX_QCOM_InterlaceFrameProgressive)
3549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       DEBUG_PRINT("Interlaced Frame!\n");
3551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       e->flags = MDP_DEINTERLACE;
3552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    else
3554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        e->flags = 0;
3555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->alpha = 0xff;
3556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    switch(displayWindow)
3558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
3559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case 1: destx = 0;
3560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            desty = 0;
3561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destW = vinfo.xres/2;
3562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destH = vinfo.yres/2;
3563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
3564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case 2: destx = vinfo.xres/2;
3565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            desty = 0;
3566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destW = vinfo.xres/2;
3567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destH = vinfo.yres/2;
3568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
3569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    case 3: destx = 0;
3571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            desty = vinfo.yres/2;
3572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destW = vinfo.xres/2;
3573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destH = vinfo.yres/2;
3574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
3575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     case 4: destx = vinfo.xres/2;
3576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            desty = vinfo.yres/2;
3577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destW = vinfo.xres/2;
3578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destH = vinfo.yres/2;
3579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
3580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     case 0:
3581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly     default:
3582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destx = 0;
3583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            desty = 0;
3584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destW = vinfo.xres;
3585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            destH = vinfo.yres;
3586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(portFmt.format.video.nFrameWidth < destW)
3590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly          destW = portFmt.format.video.nFrameWidth ;
3591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if(portFmt.format.video.nFrameHeight < destH)
3594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly           destH = portFmt.format.video.nFrameHeight;
3595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst_rect.x = destx;
3597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst_rect.y = desty;
3598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst_rect.w = destW;
3599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->dst_rect.h = destH;
3600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //e->dst_rect.w = 800;
3602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //e->dst_rect.h = 480;
3603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src_rect.x = 0;
3605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src_rect.y = 0;
3606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src_rect.w = portFmt.format.video.nFrameWidth;
3607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    e->src_rect.h = portFmt.format.video.nFrameHeight;
3608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //e->src_rect.w = portFmt.format.video.nStride;
3610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //e->src_rect.h = portFmt.format.video.nSliceHeight;
3611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ioctl(fb_fd, MSMFB_BLIT, &img)) {
3613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("MSMFB_BLIT ioctl failed!\n");
3614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return;
3615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (ioctl(fb_fd, FBIOPAN_DISPLAY, &vinfo) < 0) {
3618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("FBIOPAN_DISPLAY failed! line=%d\n", __LINE__);
3619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return;
3620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
3621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DEBUG_PRINT("render_fb complete!\n");
3623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
3624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
3625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint disable_output_port()
3626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("DISABLING OP PORT\n");
3628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_lock(&enable_lock);
3629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sent_disabled = 1;
3630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Send DISABLE command
3631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SendCommand(dec_handle, OMX_CommandPortDisable, 1, 0);
3632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&enable_lock);
3633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // wait for Disable event to come back
3634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    wait_for_event();
3635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(p_eglHeaders) {
3636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(p_eglHeaders);
3637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        p_eglHeaders = NULL;
3638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pPMEMInfo)
3640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Freeing in external pmem case:PMEM");
3642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPMEMInfo);
3643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPMEMInfo = NULL;
3644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pPlatformEntry)
3646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Freeing in external pmem case:ENTRY");
3648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPlatformEntry);
3649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformEntry = NULL;
3650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pPlatformList)
3652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Freeing in external pmem case:LIST");
3654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(pPlatformList);
3655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pPlatformList = NULL;
3656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (currentStatus == ERROR_STATE)
3658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      do_freeHandle_and_clean_up(true);
3660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return -1;
3661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("OP PORT DISABLED!\n");
3663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return 0;
3664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint enable_output_port()
3667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int bufCnt = 0;
3669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE ret = OMX_ErrorNone;
3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("ENABLING OP PORT\n");
3671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Send Enable command
3672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_SendCommand(dec_handle, OMX_CommandPortEnable, 1, 0);
3673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_EGL_IMAGE_TEST_APP
3674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Allocate buffer on decoder's o/p port */
3675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portFmt.nPortIndex = 1;
3676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (use_external_pmem_buf)
3677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Enable op port: calling use_buffer_mult_fd\n");
3679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        error =  use_output_buffer_multiple_fd(dec_handle,
3680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               &pOutYUVBufHdrs,
3681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               portFmt.nPortIndex,
3682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               portFmt.nBufferSize,
3683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                               portFmt.nBufferCountActual);
3684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
3686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
3688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                portFmt.nBufferCountActual, portFmt.nBufferSize);
3689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (error != OMX_ErrorNone) {
3691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Output buffer error\n");
3692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
3693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
3695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("OMX_AllocateBuffer Output buffer success\n");
3697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free_op_buf_cnt = portFmt.nBufferCountActual;
3698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    error =  use_output_buffer(dec_handle,
3701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                       &pOutYUVBufHdrs,
3702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        portFmt.nPortIndex,
3703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        portFmt.nBufferSize,
3704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        portFmt.nBufferCountActual);
3705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_op_buf_cnt = portFmt.nBufferCountActual;
3706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (error != OMX_ErrorNone) {
3707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
3708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       return -1;
3709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else {
3711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
3712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // wait for enable event to come back
3716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    wait_for_event();
3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (currentStatus == ERROR_STATE)
3718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      do_freeHandle_and_clean_up(true);
3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return -1;
3721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pOutYUVBufHdrs == NULL)
3723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs is NULL\n");
3725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
3726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
3728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("OMX_FillThisBuffer on output buf no.%d\n",bufCnt);
3729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pOutYUVBufHdrs[bufCnt] == NULL)
3730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs[%d] is NULL\n", bufCnt);
3732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return -1;
3733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pOutYUVBufHdrs[bufCnt]->nOutputPortIndex = 1;
3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pOutYUVBufHdrs[bufCnt]->nFlags &= ~OMX_BUFFERFLAG_EOS;
3736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ret = OMX_FillThisBuffer(dec_handle, pOutYUVBufHdrs[bufCnt]);
3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (OMX_ErrorNone != ret) {
3738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("ERROR - OMX_FillThisBuffer failed with result %d\n", ret);
3739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
3741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("OMX_FillThisBuffer success!\n");
3743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            free_op_buf_cnt--;
3744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("OP PORT ENABLED!\n");
3747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return 0;
3748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint output_port_reconfig()
3751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("PORT_SETTING_CHANGE_STATE\n");
3753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (disable_output_port() != 0)
3754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    return -1;
3755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /* Port for which the Client needs to obtain info */
3757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    portFmt.nPortIndex = 1;
3758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
3759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Min Buffer Count=%d", portFmt.nBufferCountMin);
3760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Buffer Size=%d", portFmt.nBufferSize);
3761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(OMX_DirOutput != portFmt.eDir) {
3762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Error - Expect Output Port\n");
3763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
3764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    height = portFmt.format.video.nFrameHeight;
3766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    width = portFmt.format.video.nFrameWidth;
3767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    stride = portFmt.format.video.nStride;
3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sliceheight = portFmt.format.video.nSliceHeight;
3769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (displayYuv == 2)
3771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
3772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("Reconfiguration at middle of playback...");
3773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close_display();
3774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (open_display() != 0)
3775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
3776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        printf("\n Error opening display! Video won't be displayed...");
3777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        displayYuv = 0;
3778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
3779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (displayYuv)
3782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        overlay_set();
3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (enable_output_port() != 0)
3785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    return -1;
3786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("PORT_SETTING_CHANGE DONE!\n");
3787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	return 0;
3788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid free_output_buffers()
3791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    int index = 0;
3793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_BUFFERHEADERTYPE *pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
3794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    while (pBuffer) {
3795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n pOutYUVBufHdrs %p p_eglHeaders %p output_use_buffer %d",
3796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               pOutYUVBufHdrs,p_eglHeaders,output_use_buffer);
3797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(pOutYUVBufHdrs && p_eglHeaders && output_use_buffer)
3798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           index = pBuffer - pOutYUVBufHdrs[0];
3800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT("\n Index of free buffer %d",index);
3801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           DEBUG_PRINT("\n Address freed %p size freed %d",pBuffer->pBuffer,
3802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  pBuffer->nAllocLen);
3803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           munmap((void *)use_buf_virt_addr[index],pBuffer->nAllocLen);
3804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           if(p_eglHeaders[index])
3805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           {
3806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               close(p_eglHeaders[index]->pmem_fd);
3807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               free(p_eglHeaders[index]);
3808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               p_eglHeaders[index] = NULL;
3809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           }
3810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pOutYUVBufHdrs && use_external_pmem_buf)
3813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
3814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            index = pBuffer - pOutYUVBufHdrs[0];
3815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("\n Address freed %p size freed %d,virt=0x%x,pmem_fd=0x%x",
3816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              pBuffer->pBuffer,
3817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              pBuffer->nAllocLen,
3818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              use_buf_virt_addr[index],
3819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              pPMEMInfo[index].pmem_fd);
3820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            munmap((void *)use_buf_virt_addr[index],pBuffer->nAllocLen);
3821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            getFreePmem();
3822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            use_buf_virt_addr[index] = -1;
3823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (&pPMEMInfo[index])
3824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
3825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                close(pPMEMInfo[index].pmem_fd);
3826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pPMEMInfo[index].pmem_fd = -1;
3827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("\n Free output buffer");
3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_FreeBuffer(dec_handle, 1, pBuffer);
3831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
3832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
3837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  OMX_U32 alignment)
3838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem_allocation allocation;
3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.size = buffer_size;
3841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.align = clip2(alignment);
3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (allocation.align < 4096)
3844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    allocation.align = 4096;
3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
3848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment failed with pmem driver");
3850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
3851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint open_display()
3857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("\n Opening /dev/graphics/fb0");
3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fb_fd = open("/dev/graphics/fb0", O_RDWR);
3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
3862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("\n Opening /dev/fb0");
3863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fb_fd = open("/dev/fb0", O_RDWR);
3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (fb_fd < 0) {
3866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("[omx_vdec_test] - ERROR - can't open framebuffer!\n");
3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
3868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("\n fb_fd = %d", fb_fd);
3871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) < 0)
3872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("[omx_vdec_test] - ERROR - can't retrieve fscreenInfo!\n");
3874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fb_fd);
3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("[omx_vdec_test] - ERROR - can't retrieve vscreenInfo!\n");
3880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(fb_fd);
3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid close_display()
3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  overlay_unset();
3889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  close(fb_fd);
3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fb_fd = -1;
3891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid getFreePmem()
3894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION
3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int ret = -1;
3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   /*Open pmem device and query free pmem*/
3898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int pmem_fd = open (PMEM_DEVICE,O_RDWR);
3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(pmem_fd < 0) {
3901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ALOGE("Unable to open pmem device");
3902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return;
3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   struct pmem_freespace fs;
3905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ret = ioctl(pmem_fd, PMEM_GET_FREE_SPACE, &fs);
3906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(ret) {
3907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     ALOGE("IOCTL to query pmem free space failed");
3908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     goto freespace_query_failed;
3909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
3910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ALOGE("Available free space %lx largest chunk %lx\n", fs.total, fs.largest);
3911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevfreespace_query_failed:
3912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   close(pmem_fd);
3913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3915