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