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