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